我想在不同控制器的各种视图中使用以下部分。是否有一种方法来取代@person
与一个更一般的变量,简单地调用当前控制器的实例变量,不管它是@person
或@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
这是可行的。试试这个:
<% 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 %>
当然,你会想要做错误/nil检查。如果您是MVC纯粹主义者(或者只是喜欢干净的代码),您可能希望将其移到helper中。但这是一个功能的起点。
希望有帮助!
在每个控制器中定义一个方法,该方法提供您正在查找的元素。例如,在PersonController
def current_element
@person
end
并将此方法定义为ApplicationController
中的helper,因此该方法可从视图
helper_method :current_element
使用这个方法的结果作为你的部分的参数:
_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 }