2010-10-03 31 views
1

在rails中,是否可以在创建新对象时传递参数,并相应地设置一些值?rails,在设置新对象时传递参数

例如,如果我有一个包含项目列表的屏幕以及在顶部创建新项目的链接。如果我要在“新建”链接旁边放置一个“项目类型”下拉列表,我将如何将该值传递给项目控制器上的新功能并将其设置为@ item.item_type?从JC下面

的答复后


编辑如果控制器我有以下几点:

@entry = Entry.new 

if (params[:type]) 
    @entry.entry_type = params[:type] 
end 

和链接,使一个新的对象是

<%= link_to "Make new article", {:controller => '/dashboard/entries', :action => :new}, :type => 1 %> 

那么不应该new.html.erb表单中的entry_type字段设置为1?

+0

我尝试添加一个参数到form_for:<%form_for @entry,:entry_type => params [:type],:html => {:multipart => true} do | f | %>但这不起作用 – nktokyo 2010-10-03 11:38:26

回答

3

您所描述的只是控制器的new操作的标准表单以及相应的create操作,用于接收表单数据并创建对象。您可以生成支架的文件,看看它是如何工作的例子,但简而言之,是这样的(假设一个RESTful设计):

# new.html.erb 
<% form_for @item || Item.new do |f| %> 
    <%= f.select :type, { 'type1' => 1, 'type2' => 2 } %> 
    <%= f.submit %> 
<% end %> 

# ItemsController#create 
@item = Item.new(params[:item]) 
if @item.save 
    redirect_to @item 
else 
    render :new 
end 

从表单中的数据是在控制器的params散列可用并用于初始化新对象。

+1

我正在写一个类似的答案。没错,这是一种绝对标准的选择。在你的代码中只有一个细节:而不是编写Item.new,最好使用@item(来自控制器),这种方式是渲染:来自操作create的new将保持用户先前的值。 – tokland 2010-10-03 12:41:57

+0

你好,我仍然不明白新对象如何可以拿起传入的值。我在原文中增加了额外的解释,让我看看我在尝试 – nktokyo 2010-10-03 13:02:01

+0

@tokland - 你说得对。我将更新我的代码以显示我在模板中实际执行的操作。最初我只是给了一个真正的骨头版本。 – 2010-10-03 13:30:26