form_for的多个嵌套资源

时间:2014-11-07 07:28:11

标签: ruby-on-rails

我正在关注rails入门教程并且一直在更改模型以帮助我修改rails。 我有一篇文章模型,其中有很多评论:

class Article < ActiveRecord::Base
  has_many :comments, dependent: :destroy
  validates :title, presence: true,
                    length: { minimum: 5 }
end

class Comment < ActiveRecord::Base
  belongs_to :article
end

的routes.rb

resources :articles do
  resources :comments
end

创建评论的视图是部分的(根据rails教程)

<%= form_for([@article, @article.comments.build]) do |f| %>
  <p>
    <%= f.label :commenter %><br>
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :body %><br>
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit %>
  </p>    
<% end %> 

这很好但是我想把这个分开来让评论者成为一个单独的模型(我知道它不是很好的OO,但我只是在这里试验!)

因此,我创建了一个评论者模型:

class Commenter < ActiveRecord::Base
  belongs_to :comment
end

将评论更改为:

class Comment < ActiveRecord::Base
  has_one :commenter
  belongs_to :article
end

的routes.rb

resources :commenters

resources :articles do
 resources :comments
end  

resources :comments do
  resource :commenter
end  

我想以单一形式同时创建评论和评论者,但我仍然坚持如何改变视图以实现这一点,因为视图构建了评论模型,我是还需要在这里建立评论者模型吗?如果是这样我怎么做到这一点?

<%= form_for([@article, @article.comments.build]) do |f| %>
  <p>
    <%= f.label :commenter %><br>
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :body %><br>
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit %>
  </p>    
<% end %> 

1 个答案:

答案 0 :(得分:1)

对于您的目标,您需要实现嵌套表单。 从您提供的代码中,我已经展示了如何更改它。

<强>模型

class Article < ActiveRecord::Base
has_many :comments, dependent: :destroy

accepts_nested_attributes_for :comments    # This is required for @article to save the forms nested within it

validates :title, presence: true,
                length: { minimum: 5 }
end

class Comment < ActiveRecord::Base
  belongs_to :article
  accepts_nested_attributes_for :commenter    # Required to save nested Commenter form
end

class Commenter < ActiveRecord::Base
  belongs_to :comment
end

文章控制器

在有人决定评论文章时将会调用的操作中,您需要选择@article并为评论创建评论和评论者。必须在呈现表单之前创建它们,否则它们将不会显示。

def create_comment

    @article.find(:id_of_article)                     
    @comment = @article.comments.find(:id_of_new_comment)  
    @comment.create_commenter 

end

查看

最后是表格

<%= form_for(@article) do |f| %>

    <%= f.fields_for(:comments, @comment) do |comment| %>  # As article will have many comments, you need to specify the new comment you want to display

        <%= comment.label :comment %><br>
        <%= comment.text_field :comment %>

        <%= comment.fields_for(:commenter) do |commenter| %>

            <%= commenter.label :commenter_name %>
            <%= commenter.text_field :commenter_name %>

        <%end%>
    <%end%>

    <%= f.submit %>

<% end %>

无论如何,我希望这会有所帮助。虽然如果你还在做你的教程,你应该很快就会学到这一点。