在模型的索引处创建一个创建表单

时间:2011-07-22 10:33:41

标签: ruby-on-rails

我想问一下我做的是不是一个好习惯。

我有两种模式:讨论有很多帖子

在我的讨论#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,并想问是否有更好的实践来实现我的目标。

1 个答案:

答案 0 :(得分:1)

如果您在提交新的discussion_id表单时不需要Post,那么您只需执行

@post = Post.new

如果您确实需要在新discussion_id对象上设置Post,那么您可以在不将新对象添加到@discussion.posts

的情况下执行此操作
@post = Post.new(:discussion => @discussion)