将这样的逻辑移动到控制器或模型而不是视图?

时间:2017-01-06 16:42:20

标签: ruby-on-rails ruby

我目前在我看来有这个逻辑

<% tools_count = @job.tools.count - 1 %>
    <% count = 0 %>
    <% @job.tools.each do |u|%>
        <%= u.name %>
        <% if count != tools_count  %>
        <% count += 1 %>
        <%= "," %>
    <%end%>
<% end %>

除非它是列表的末尾,否则它只会遍历一些用户关系并放入a。

我的问题:这种逻辑看起来非常混乱,堵塞了我的观点我知道必须有一个更好的方法,通过将它移动到控制器或模型,有没有人知道正确的方法来做这种逻辑?

3 个答案:

答案 0 :(得分:3)

您可以将这样的方法添加到Job模型中:

def tool_names
  tools.map(&:name).join(',')
end

并在您的视图中使用它:

<%= @job.tool_names %>

答案 1 :(得分:2)

有几种方法可以避免在视图层中放置这种逻辑:

  1. 在模型类中创建一个实例方法(如spickermann建议的那样)
  2. 这适用于简单的逻辑和简单的项目。但是,如果您想使用type MyPostBody struct { SomeVar string `json:"someVar"` } pb := &MyPostBody{SomeVar: "someValue"} jsonStr, err := json.Marshal(pb) if err != nil { log.Fatalf("could not marshal JSON: %s", err) } req, err := http.NewRequest("POST", APIURL, bytes.NewBuffer(jsonStr)) 中的某些帮助,例如ActionView::Helpersjobs_path,那么模型就不适合它。

    1. 在辅助模块中创建辅助方法eq。 number_to_currency
    2. 通常,您可以在助手中放置与视图层相关的任何辅助方法。例如,共享用于构建视图组件的常用方法。

      1. 使用装饰器/演示者模式并将视图逻辑放在那里,这样模型就不会受到污染。以下是使用JobHelpers gem:http://johnotander.com/rails/2014/03/07/decorators-on-rails/
      2. 对模式和示例实现的更多解释

答案 2 :(得分:0)

您可以在一行中执行此操作,例如

<%= @job.tools.map(&:name).join(',') %>