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



我想在不同控制器的各种视图中使用以下部分。是否有一种方法来取代@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 } 

相关内容

  • 没有找到相关文章

最新更新