【问题标题】:How can I trigger an action from a different controller for dynamic content?如何从不同的控制器触发动态内容的操作?
【发布时间】:2018-06-18 14:36:59
【问题描述】:

我有一个动态标题,具体取决于控制器的视图和操作,它可以与“welcomes_controller”中的操作一起正常工作。但在这种情况下,我无法从其他控制器触发动作 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 %>

【问题讨论】:

  • 尝试使用action_name 而不是params[:action]

标签: ruby-on-rails dynamic controller routes


【解决方案1】:

有两个助手很容易做到这一点:controller_nameaction_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

认为助手可以访问controller_nameaction_name,但如果没有,您可以将这些作为参数传递给header_image_tag,或者将request 作为参数传递并访问request.controller_namerequest.action_name

让我知道你的想法和你的进展。

【讨论】:

  • 您好,感谢您的详细回答!我无法让它与 image_tag 的约定一起工作,所以我使用了控制器中的变量的方法,它完美地工作!谢了!
【解决方案2】:

为此,我使用此代码。这应该适用于您想要实现的目标。

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

另外请记住,如果您需要更细化您想要定位的特定控制器,您还可以将控制器名称添加到检查中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多