Rails语法将POST参数从表单传递到控制器

时间:2011-12-18 22:36:41

标签: ruby-on-rails-3 forms parameters controller

我是Rails的新手(对于一般的编程来说还是新手),我正在为自己构建一个Web应用程序作为一种学习方式。现在我正在修改脚手架形式等。

我的问题是我的一个控制器中的“创建”方法。我关注的有两个实体:User表和Habit表。我在习惯视图的_form部分创建了一个下拉框,允许一个人在创建习惯时从所有可用列表中选择一个用户,如下所示

<%= collection_select  :user, :id, @users, :id, :first_name %>

习惯控制者当然有

def new
  @users = User.all
  ...    
end

这很好用,当表单提交时会发布两个参数哈希:habit和:user。现在,当我想在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

所以我的问题是,当处理一个在多个哈希中发布数据的表单时,将这些参数传递给控制器​​中某些方法的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

  

所以我的问题是,当处理一个在多个哈希中发布数据的表单时,将这些参数传递给控制器​​中某些方法的正确方法是什么?

不要说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的便捷功能。

答案 1 :(得分:0)

更改

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