【问题标题】:How to move logic out of views and into controller in Rails如何将逻辑移出视图并移入 Rails 中的控制器
【发布时间】:2012-07-18 00:53:35
【问题描述】:

我正在用 Ruby on Rails 编写 imageboard

我有一个创建新帖子的表单。在这种形式中,有逻辑可以确定帖子是从 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'%>

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

【问题讨论】:

    标签: ruby model-view-controller view controller logic


    【解决方案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 %>
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      附带说明一下,您可以稍微精简一下条件句。 if @boardif @board != nil 相同(除非您有 @boardfalse 的特殊情况。nilfalse 都将评估为 false)。

      【讨论】:

      • 你的第一个想法不会太干净,因为我在 url 中使用了板标题,而不是 id。我最终选择了你的第二个想法,只使用 if @board 并保留其他所有内容。谢谢!
      【解决方案3】:

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

      否则,通过 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 %>
      

      只需在board#show 中执行@post.board_id = @board.idtopic#show 的等效代码。您甚至可以使用@post = @board.posts.build,这应该会自动分配 id。

      【讨论】:

        猜你喜欢
        • 2016-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        相关资源
        最近更新 更多