【问题标题】:How to get the instance variable of the current controller?如何获取当前控制器的实例变量?
【发布时间】:2013-01-19 13:34:52
【问题描述】:

我想在不同控制器的各种视图中使用以下部分。有没有办法将@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 

【问题讨论】:

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


    【解决方案1】:

    这是可行的。试试这个:

    <% 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 纯粹主义者(或者只是喜欢干净的代码),您可能希望将其移至帮助程序。但这是一个功能性的起点。

    希望有帮助!

    【讨论】:

    • 效果很好,非常感谢!我将代码移动到application_helper.rb 内的辅助函数中并将其发布在上面。我将如何在这里检查错误或空值?不确定我的语法是否也那么好。
    • @Tintin81 - 在使用之前确保current_object 不为零。这是为了防止这个助手从user_index 被调用,比如说,没有特定的user 可以使用。这就是我能想象出的所有错误......很高兴我能提供帮助!
    【解决方案2】:

    在每个控制器中定义一个方法来提供您正在寻找的元素。比如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 } 
    

    【讨论】:

    • 谢谢!我相信这也会起作用,但我有一大堆控制器,不确定我是否想将那条线添加到所有这些控制器中。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多