我想问一下我做的是不是一个好习惯。
我有两种模式:讨论有很多帖子。
在我的讨论#show 中显示所有帖子。现在我想添加一个表单,所以我可以在讨论中创建一个新帖子。
discuss_controller.rb show()
@discussion = Discussion.find(params[:id])
@post = @discussion.posts.build
show.html.erb
<%= render :partial => 'posts/form' %>
<%= render @discussion.posts %>
<%= link_to 'Edit', edit_discussion_path(@discussion) %> |
<%= link_to 'Back', discussions_path %>
_post.html.erb
<div class="post">
<p>
<b>Content:</b>
<%= post.content %>
</p>
<%= link_to 'Edit', edit_post_path(post) %> |
<%= link_to 'Back', posts_path %>
</div>
这将导致'edit'和'back'link_to方法出错,因为我构建的新post对象将成为 @ discussion.posts 的一部分,因为那个新帖子是如果没有保存,edit_post_path网址助手会发出“无路由匹配”错误(找不到未保存的帖子)。
如果我想保留'edit'和'back'link_to方法,我必须过滤掉新构建的(但未保存的)对象。但不知怎的,我觉得我所做的可能是hackish,并想问是否有更好的实践来实现我的目标。
答案 0 :(得分:1)
如果您在提交新的discussion_id
表单时不需要Post
,那么您只需执行
@post = Post.new
如果您确实需要在新discussion_id
对象上设置Post
,那么您可以在不将新对象添加到@discussion.posts
@post = Post.new(:discussion => @discussion)