代码之家  ›  专栏  ›  技术社区  ›  trickydiddy

如何从不同的控制器触发动态内容的操作?

  •  0
  • trickydiddy  · 技术社区  · 7 年前

    im有一个动态头,取决于控制器的视图和操作,它与“欢迎控制器”中的操作配合得很好。但在这种情况下,im无法从其他控制器触发操作posts_controller。

    如何正确触发? 提前谢谢。

    <% if params[:action] == 'index' %>
      <%= image_tag("header_background.jpg", alt: "header background", :class => "header_background") %>
    <% elsif params[:action] == 'trading' %>
      <%= image_tag("trading_background.jpg", alt: "trading background", :class => "header_background") %>
    
    <% elseif ... HOW TO TRIGGER A ACTION FROM A DIFFERENT CONTROLLER? %>
    
    <% end %>
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   SRack    7 年前

    有两个助手很容易做到这一点: controller_name action_name . 您可以将这些组合用于条件呈现。

    也就是说,就我个人而言,我觉得这是一个意见的混乱-我不能不觉得这将是更好的设置在别处。在一个非常简单的意义上,您可以在控制器中添加以下内容:

    def index
      @header_image = "header_background.jpg"
    end
    
    def trading
      @header_image = "trading_background.jpg"
    end
    

    然后在视图中:

    image_tag(@header_image, alt: @header_image, :class => "header_background")
    

    或者,您可以遵循图像的约定:

    image_tag("#{controller_name}/#{action_name}.jpg", alt: action_name, :class => "header_background")
    

    然后确保您的头图像存储在一个以控制器命名的文件夹中,命名为相关动作之后。

    我倾向于后者。


    更新:最后一个选项是定义一个助手来处理这个问题,比如,在您的视图中:

    = header_image_tag
    

    在你的内心深处 /helpers 文件夹类似于:

    def header_image_tag
      image_path = case controller_name
                   when "controller_one"
                     "header_background.jpg" if action_name == "index"
                     "trading_background.jpg" if action_name == "trading"
                   when "controller_two"
                     # ...
                   else
                     "default_image.jpg"
                   end
      image_tag image_path, alt: # ...etc
    end
    

    I 认为 帮助者可以访问 控制器名 动作名 ,但如果不能,您可以将这些作为参数传递给 header_image_tag ,或通过 request 作为arg和访问 request.controller_name request.action_name .

    告诉我你的想法和进展。

        2
  •  1
  •   Rockwell Rice    7 年前

    为此我使用这个代码。这应该对你想要达到的目标有用。

    <% if controller.action_name.to_s == "index" %>
    

    此外,请记住,如果您需要更具体粒度与特定的控制器,你要目标,你也可以添加控制器名称到检查。

    <% if controller.controller_name.to_s == "posts" && controller.action_name.to_s == "index" %>