0

我有一个部分需要运行一些控制器逻辑才能正常渲染。是否有某种方法可以将部分与渲染时运行的某些控制器逻辑相关联?

例如,这就是我当前的代码:

我的数据控制器:

class MyDataController < ApplicationController
  def view
    @obj = MyData.find(params[:id])
    run_logic_for_partial
  end

  def some_method_i_dont_know_about
    @obj = MyData.find(params[:id])
    # Doesn't call run_logic_for_partial
  end

  def run_logic_for_partial
    @important_hash = {}
    for item in @obj.internal_array
      @important_hash[item] = "Important value"
    end
  end
end

view.html.erb:

Name: <%= @obj.name %>
Date: <%= @obj.date %>
<%= render :partial => "my_partial" %>

some_method_i_dont_know_about.html.erb:

Name: <%= @obj.name %>
User: <%= @obj.user %>

<%# This will fail because @important_hash isn't initialized %>
<%= render :partial => "my_partial" %>

_my_partial.html.erb:

<% for item in @obj.internal_array %>
  <%= item.to_s %>: <%= @important_hash[item] %>
<% end %>

即使没有从控制器显式调用该方法,如何确保在渲染run_logic_for_partial时调用它?_my_partial.html.erb如果我不能,Rails 中是否有任何常见的模式来处理这些情况?

4

2 回答 2

3

您尝试执行的操作与 Rails 控制器/视图的设计使用方式背道而驰。最好以不同的方式构造事物。为什么不放入run_logic_for_partial一个助手,并让它接受一个论点(而不是隐含地工作@obj)?

要查看视图“帮助器”的示例,请查看此处: http: //guides.rubyonrails.org/getting_started.html#view-helpers

于 2013-06-17T16:43:32.300 回答
3

您应该为这种逻辑使用视图助手。如果您使用 生成资源rails generate,则资源的帮助文件应该已经在您的app/helpers目录中。否则,您可以自己创建它:

# app/helpers/my_data.rb
module MyDataHelper
    def run_logic_for_partial(obj)
        important_hash = {}
        for item in obj.internal_array
            important_hash[item] = "Important value" // you'll need to modify this keying to suit your purposes
        end
        important_hash
    end
end

然后,在您的部分中,将您想要操作的对象传递给您的助手:

# _my_partial.html.erb
<% important_hash = run_logic_for_partial(@obj) %>
<% for item in important_hash %>
    <%= item.to_s %>: <%= important_hash[item] %>
<% end %>

或者:

# app/helpers/my_data.rb
module MyDataHelper
    def run_logic_for_partial(item)
        # Do your logic
        "Important value"
    end
end

# _my_partial.html.erb
<% for item in @obj.internal_array %>
    <%= item.to_s %>: <%= run_logic_for_partial(item) %>
<% end %>

编辑:

正如评论 Ian Kennedy 指出的那样,这个逻辑也可以合理地抽象为模型中的一种方便方法:

# app/models/obj.rb
def important_hash
    hash = {}
    for item in internal_array
        important_hash[item] = "Important value"
    end
    hash
end

然后,您将important_hash在部分中以下列方式访问该属性:

# _my_partial.html.erb
<% for item in @obj.important_hash %>
    <%= item.to_s %>: <%= item %>
<% end %>
于 2013-06-17T16:57:53.840 回答