【问题标题】:Rails 3, change or fill submitted form values in controllerRails 3,在控制器中更改或填写提交的表单值
【发布时间】:2013-04-13 02:58:28
【问题描述】:

我有两个独立的“组件”模型,联系人和文章。联系人有多种类型(生产商、出口商等...)。

在新文章表单中,我有一个包含联系人(id 和标题)的下拉选择器,并且希望将选定的值和文本存储在文章表中。

在新文章表单视图中:

<%= f.select :producer_id, options_for_select(producers, @article.producer_id) %>

这行得通,producer_id 存储在文章表中。

这对我来说很清楚且合乎逻辑,但在某些情况下,我还需要将所选联系人的标题存储在 producer_title 中。

我已经阅读了许多不同的选项,例如“在模型中执行,保存前”或“在控制器中执行”,并且我已经在控制器中完成了。

文章控制器(仅更新的一部分):

#cont_name is producer title from Contacts
def update
  params[:article][:producer_title] = Contact.where(id: params[:article][:producer_id]).pluck(:cont_name).first 
end

这可行,但它是解决此问题的最佳实践方法吗?

另外,如果我将params[producer_id] 部分更改为使用:id: params[:producer_id],为什么我不能让它工作?

最好的问候和感谢。

【问题讨论】:

    标签: ruby-on-rails ruby form-submit before-save


    【解决方案1】:

    不如这样:

    def edit
      @article = Article.find(params[:id])
      @producers = Contact.where(type: "producer") # or however you distinguish between producers and other contacts
    end
    

    然后在您的表单中将其更改为:

    f.select :producer_id, options_from_collection_for_select(@producers, "cont_name")
    # you might need to do (@producers, "cont_name", "cont_name"), can't quite remember
    

    那么你的更新操作会简单很多:

    def update
      @article = Article.find(params[:id])
      if @article.update_attributes(params[:article])
        ...
      else
        ...
      end
    end
    

    :id =&gt; params[:producer_id] 不起作用的原因是 params 是一个嵌套哈希,所以类似于:

    params = { :article => { :producer_id => 34, :title => "Cool Article" }, :another_key => { :key => :value } }
    

    所以要访问producer_id,您首先必须检索article 哈希,否则它只会查看第一组键,包括上面示例中的articleanother_key,但不要包括producer_id

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      相关资源
      最近更新 更多