如何获取当前控制器的实例变量?

时间:2013-01-19 13:34:52

标签: ruby-on-rails ruby-on-rails-3

我想在不同控制器的各种视图中使用以下部分。有没有办法用一个简单调用当前控制器的实例变量的更通用的变量替换@person,无论它是@person还是@user还是{{1}或者其他什么?

@company

感谢您的帮助。

这是我的助手功能,基于Xavier的代码:

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

2 个答案:

答案 0 :(得分: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纯粹主义者(或者就像干净的代码一样),你可能想把它转移到帮助者身上。但这是一个功能性的起点。

希望有所帮助!

答案 1 :(得分:0)

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

 def current_element 
   @person
 end

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

 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 } 
相关问题