我正在关注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 %>
答案 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 %>
无论如何,我希望这会有所帮助。虽然如果你还在做你的教程,你应该很快就会学到这一点。