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的更多类似的便捷功能。

+0

啊,OK。所以大规模的任务是一种捷径。这就说得通了。还有一个语法问题:如果:用户散列有多个键(在前面的例子中它只有一个),这个散列是否会分配散列“@habit = params [:user]'?换句话说,你可以在现有的对象上使用质量分配吗?非常感谢您的帮助! – bknoles 2011-12-18 23:20:50

+0

否; '@habit = params [:user]'复制了'params [:user]'对象(这是一个散列),因此你所做的只是用这个覆盖'@习惯'。不过,您可以执行'@habit.attributes = '。 – 2011-12-19 14:46:09

变化

<%= 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 %> 
+0

谢谢!这些例子帮助我理解select,collection选择等的参数。 – bknoles 2011-12-18 23:29:36