Rails从多个模型中添加params

时间:2013-02-15 07:52:43

标签: controller ruby-on-rails-3.2

我不知道这样做的正确方法是什么,所以我希望得到一些关于如何做到这一点的好建议。 假设您有一个具有多个关系的模型作为belongs_to-statements,例如一本书。一本书有作者(用户)和出版商:

belongs_to :user
belongs_to :publisher

大。用户通过多个:通过

签署给发布者
has_many :contracts
has_many :publishers, through: :contracts

发布商模型也是如此。作者和出版商都有很多书。到现在为止还挺好。 现在,您有一个发布商展示视图,您可以在其中呈现图书的部分形式,因为您希望直接从发布商的“展示”视图中添加图书。

现在,您想要提交表单并告知关系,您必须将图书模型与发布者和作者数据一起提供。

现在的问题是,如何做到这一点。将数据合并到本书创建方法中的参数似乎运作良好:found on stackoverflow

我很擅长使用author_id在表单中创建一个隐藏字段,但没有追踪它,因为它感觉很脏。

这样做的“正确”方法是什么?提前谢谢......

1 个答案:

答案 0 :(得分:0)

您可以使用嵌套模型表单和嵌套属性来执行此操作。 您有两个关于主题的RailsCasts:part 1part 2,您可以在其中查看其工作原理。还有mandatory documentation on subject

如果你选择这种方式,那么这是最新的rails版本的更新方法版本:

  def link_to_remove_fields(name, f)
    f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)", :class => "icon-remove")
  end

  def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render(association.to_s.singularize + "_fields", :f => builder)
    end
    link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
  end

因为截屏版本不适用于更高版本的rails。