【问题标题】:Rails syntax Passing POST parameters from a form to a controllerRails 语法将 POST 参数从表单传递到控制器
【发布时间】:2011-12-18 22:36:40
【问题描述】:

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

我的问题是我的一个控制器中的“创建”方法。我关心两个实体:用户表和习惯表。我在 _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 散列中的参数,但未设置 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

所以我的问题是,在处理以多个散列形式发布数据的表单时,将这些参数传递到控制器中的某个方法的正确方法是什么?

【问题讨论】:

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


    【解决方案1】:

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

    不要说Habit.new( &lt;lots of stuff&gt; ),而是使用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 便捷功能。

    【讨论】:

    • 啊,好的。所以批量分配是一种捷径。这就说得通了。还有一个语法问题:如果 :user 哈希有多个键(在前面的示例中它只有一个),那么这个批量是否会分配该哈希 @habit = params[:user]?换句话说,您可以对现有对象使用质量分配吗?非常感谢您的帮助!
    • 否; @habit = params[:user] 复制了 params[:user] 对象(这是一个哈希),所以你所做的只是用它覆盖 @habit。不过,您可以使用@habit.attributes = &lt;some hash&gt;
    【解决方案2】:

    改变

    <%= 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 select 等的参数。
    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多