【问题标题】:Can I get the name of the current controller in the view?我可以在视图中获取当前控制器的名称吗?
【发布时间】:2011-04-15 00:33:32
【问题描述】:

有没有办法从视图中找出当前控制器是什么?

举个例子说明为什么我想知道这一点:如果多个控制器共享相同的布局,我可能在布局 ERB 文件中有一部分我想基于控制器突出显示当前页面的菜单项。

也许这是一个不好的方法。如果是这样,更可取的方法是什么?

不过,我很想知道如何获取当前控制器的名称。

(显然我可以在每个控制器中添加类似 @controller_name = 'users' 的内容;但这似乎是 Rails 已经在幕后完成的事情。所以我只是想知道是否有内置方法。)

【问题讨论】:

    标签: ruby-on-rails model-view-controller view controller


    【解决方案1】:

    controller_name 包含用于为当前视图提供服务的控制器的名称。

    【讨论】:

    • 实际上在视图中使用params 是不好的做法。请改用controller_name
    • @coorasse 是对的,当然信息就在那里,但是依靠 controller_name 更好
    【解决方案2】:

    使用controller.controller_name

    在 Rails 指南中,它说:

    params 哈希将始终包含 :controller 和 :action 键,但您应该使用 controller_nameaction_name 方法来访问这些值

    ActionController Parameters

    假设你有一个 CSS 类 active ,它应该插入到页面当前打开的任何链接中(也许这样你就可以设置不同的样式)。如果您有一个带有about 操作的static_pages 控制器,那么您可以在视图中像这样突出显示链接:

    <li>
      <a class='button <% if controller.controller_name == "static_pages" && controller.action_name == "about" %>active<%end%>' href="/about">
          About Us
      </a>
    </li>
    

    【讨论】:

    • 如果你的控制器在这样的命名空间后面:Admin::Orders 那么controller_nameparams[:controller] 将分别是"orders""admin/orders"
    【解决方案3】:
    #to get controller name:
    <%= controller.controller_name %>
    #=> 'users'
    
    #to get action name, it is the method:
    <%= controller.action_name %>
    #=> 'show'
    
    
    #to get id information:
    <%= ActionController::Routing::Routes.recognize_path(request.url)[:id] %>
    #=> '23'
    
    # or display nicely
    <%= debug Rails.application.routes.recognize_path(request.url) %>
    

    reference

    【讨论】:

    • 要获取 id,ActionController::Routing::Routes 不再起作用。你可以这样做:
    【解决方案4】:

    controller_path 保存用于服务当前视图的控制器的路径。 (即:admin/settings)。

    controller_name 包含用于服务当前视图的控制器的名称。 (即:settings)。

    【讨论】:

      【解决方案5】:

      如果您想在您的应用程序中使用所有样式表,只需在 application.html.erb 中添加这一行。将其插入&lt;head&gt; 标签内

        <%= stylesheet_link_tag  controller.controller_name , media: 'all', 'data-turbolinks-track': 'reload' %>
      

      另外,在不同的控制器上指定相同的类 CSS
      在application.html.erb的body添加这一行

        <body class="<%= controller.controller_name %>-<%= controller.action_name %>">
      

      因此,例如,现在我想更改“home”控制器和“index”操作中的p 标签。 在index.scss 文件内添加。

      .nameOfController-nameOfAction <tag> { }
      

       .home-index p {
              color:red !important;
            }
      

      【讨论】:

        猜你喜欢
        • 2011-02-13
        • 1970-01-01
        • 2023-03-21
        • 2012-08-19
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多