Rails语法将POST参数从表单传递给控制器
我是Rails的新手(对于编程来说相当新颖),我正在为自己构建一个Web应用程序作为学习的方式。现在我正在修改脚手架表格等。Rails语法将POST参数从表单传递给控制器
我的问题是在我的控制器中的“创建”方法。有两个我关心的实体:用户表和Habit表。我在_form创建一个下拉框部分的习惯看法,让一个人从所有可用的列表创建一个习惯如下
<%= collection_select :user, :id, @users, :id, :first_name %>
习惯控制器时,选择用户,当然有
def new
@users = User.all
...
end
这工作得很好,当表单提交时发布两个哈希参数:习惯和:用户。现在,当我想要在create方法中处理表单输入时,我不确定如何正确使用该语法并将user_id分配给新创建的习惯。我想要做的是这样的事情
def create
@habit = Habit.new(params[:habit], params[:user])
end
这当然是不正确的语法。
def create
@habit = Habit.new(params[:habit])
end
正确地分配来自:habit hash的params,但是然后user_id保持未设置状态。
有效的是以下内容,但代码非常冗长,需要手动分配每个值。
def create
@habit = Habit.new(:user_id => params[:user][:id],
:description => params[:habit][:description],
:habit_method => params[:habit][:habit_method],
:time_reqd => params[:habit][:time_reqd],
:will_reqd => params[:habit][:will_reqd],
:active => params[:habit][:active])
end
所以我的问题是,有一种形式,在多个散列数据发布,什么是这些参数传递到控制器中的一些方法的正确方法处理时?
所以我的问题是,当处理一个窗体在多个散列中发布数据时,将这些参数传递到控制器中的某些方法的正确方法是什么?
而不是说Habit.new(<lots of stuff>)
,只是使用Habit.new(params[:habit])
。 Rails会尝试将散列中的每个键(在本例中为params[:habit]
散列键)分配给对象上的匹配值。
因此,如果params [:habit]有一个:description
键,它将被分配到模型上的一个名为description
的字段。这被称为大规模转让,非常方便。
现在,你可以这样做:
@habit = Habit.new(params[:habit])
@habit.user_id = params[:user][:id]
您可能需要阅读RoR Getting Started Guide,像this section,为Rails的更多类似的便捷功能。
变化
<%= collection_select :user, :id, @users, :id, :first_name %>
要
<%= collection_select :habit, :user_id, @users, :id, :first_name %>
现有的脚手架代码应该只是工作后
备用
<%= f.select :user_id, @users, :id, :first_name %>
谢谢!这些例子帮助我理解select,collection选择等的参数。 – bknoles 2011-12-18 23:29:36
啊,OK。所以大规模的任务是一种捷径。这就说得通了。还有一个语法问题:如果:用户散列有多个键(在前面的例子中它只有一个),这个散列是否会分配散列“@habit = params [:user]'?换句话说,你可以在现有的对象上使用质量分配吗?非常感谢您的帮助! – bknoles 2011-12-18 23:20:50
否; '@habit = params [:user]'复制了'params [:user]'对象(这是一个散列),因此你所做的只是用这个覆盖'@习惯'。不过,您可以执行'@habit.attributes ='。 –
2011-12-19 14:46:09