2

我正在用 Ruby on Rails编写图像板。

我有一个创建新帖子的表格。在这种形式中,有逻辑可以确定帖子是从 board#show 还是 topic#show 创建的,并采取相应的行动。这是:

  <% if @board != nil %>
    <%= f.hidden_field :board_id, :value => @board.id %>
  <% end %>

  <% if @topic != nil %>
    <%= f.hidden_field :topic_id, :value => @topic.id %>
  <% end %>

使用以下代码在 board#show 和 topic#show 上呈现表单:

<%= render :partial => 'posts/form'%>

我应该将该逻辑移至控制器吗?我该怎么做呢?

4

3 回答 3

1

我认为没有必要将其放入控制器中。我会用:locals. 所以在board#show

<%= render :partial => 'posts/form', :locals => {:resource => @board} %>

在 中执行相同topic#show操作,但使用@topic. 然后在您的表单中:

<%= f.hidden_field "#{resource.model_name.downcase}_id", :value => resource.id %>

可能有更优雅的方法来获取模型名称,但这是我的方向。

于 2012-07-18T22:01:25.690 回答
1

事实上,在视图中,它可能很好。但是,您可以(可能取决于您的应用程序)通过使用嵌套路由将板/主题信息放在 URL 中来稍微改进它。看起来像这样的路线:

/boards/4/posts
/topics/133/posts

然后你的“是来自董事会还是帖子”的逻辑可能发生在你的 PostsController 中。同样,这是否“更好”取决于您的要求,但这是解决此问题的另一种方法。

附带说明一下,您可以稍微减少条件句。if @boardif @board != nil(除非您有特殊情况@board.false并且nilfalse 将评估为假)。

于 2012-07-18T22:01:56.273 回答
0

您还应该考虑这个的多态关系。我不确定它是否合适,但可能值得一试。

否则,通过 nils 也没关系。你可以这样做:

<%= f.hidden_field :board_id, :value => @board.try(:id) %>
<%= f.hidden_field :topic_id, :value => @topic.try(:id) %>

想一想,理想情况下,控制器应该将字段分配给您拥有的任何内容f,然后代码应该是:

<%= f.hidden_field :board_id %>
<%= f.hidden_field :topic_id %>

只需执行@post.board_id = @board.idinboard#showtopic#show. 您甚至可以这样做@post = @board.posts.build,并且应该自动分配 id。

于 2012-07-18T22:21:33.363 回答