2

我想在不同控制器的各种视图中使用以下部分。有没有办法@person用一个更通用的变量来替换,它只是调用当前控制器的实例变量,不管它是@personor@user还是@company什么?

<% content_for(:timestamps) do %>
    <p>Created: <%= l @person.created_at, :format => :long %>, Last updated: <%= l @person.updated_at, :format => :long %></p>
<% end %>

谢谢你的帮助。

这是我基于 Xavier 代码的辅助函数:

def timestamps
  content_for(:timestamps) do
    current_string = controller.controller_name.singularize
    current_object = instance_variable_get("@#{current_string}")
    created_at_time = l(current_object.created_at, :format => :long)
    updated_at_time = l(current_object.updated_at, :format => :long)
    text = "Created: #{created_at_time}, Last updated: #{updated_at_time}"
    content_tag(:p, text)
  end
end 
4

2 回答 2

3

这是可行的。尝试这个:

<% content_for(:timestamps) do %>
<% current_string = controller.controller_name.singularize %>
<% current_object = instance_variable_get("@#{current_string}") %>
    <p>Created: <%= l current_object.created_at, :format => :long %>, Last updated: <%= l current_object.updated_at, :format => :long %></p>
<% end %>

当然,您需要进行错误/零检查。如果您是 MVC 纯粹主义者(或者只是喜欢干净的代码),您可能希望将其移至帮助程序。但这是一个功能性的起点。

希望有帮助!

于 2013-01-19T13:56:40.707 回答
0

在每个控制器中定义一个方法来提供您正在寻找的元素。例如,在PersonController

 def current_element 
   @person
 end

并将此方法定义为 中的助手ApplicationController,因此该方法可以从视图中使用

 helper_method :current_element

使用此方法结果作为您 partial 的参数:

_the_partial.html.erb

<% content_for(:timestamps) do %>
    <p>Created: <%= l element.created_at, :format => :long %>, Last updated: <%= l @person.updated_at, :format => :long %></p>
<% end %>

在您看来:

render :partial => 'the_partial', :locals => { :element => current_element } 
于 2013-01-19T13:55:20.940 回答