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

时间:2018-06-18 14:37:00

标签: ruby-on-rails dynamic controller routes

我有一个动态标题,具体取决于控制器的视图和操作,它可以正常使用" welcome_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 %>

2 个答案:

答案 0 :(得分:2)

有两个助手可以轻松获得: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,或者传递{{ 1}}作为arg并访问requestrequest.controller_name

让我知道你的想法和你的成就。

答案 1 :(得分:1)

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

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

另外请注意,如果您需要更精确地使用要定位的特定控制器,还可以将控制器名称添加到检查中。

https://{FunctionAppName}.azurewebsites.net/admin/extensions/EventGridExtensionConfig?functionName={EventGridTriggerFunctionName}&code={masterKey}