【问题标题】:How to use in views a controller helper method from another controller?如何在视图中使用来自另一个控制器的控制器辅助方法?
【发布时间】:2019-01-21 00:26:43
【问题描述】:

我有两个控制器有一个辅助方法,它们具有相同的名称但返回不同的东西:

class My1Controller < ApplicationController
  helper_method :my_helper

  def show
    ...
  end


  private

  def my_helper
    "Something from My1 controller"
  end
end

class My2Controller < ApplicationController
  helper_method :my_helper

  def show
    ...
  end


  private

  def my_helper
    "Something from My2 controller"
  end
end

在与My1Controller相关的app/views/my1/show.html.erb视图中,我想使用my_helperMy2Controller返回的值。

我怎样才能做到这一点?

【问题讨论】:

  • 你的意思是你正在为 My2Controller 使用app/views/my1/show.html.erb
  • @ray 我正在使用 / 只想使用来自 app/views/my1/show.html.erb 的 My2Controller 的辅助方法。

标签: ruby-on-rails ruby controller ruby-on-rails-5 helper


【解决方案1】:

将您的my_helper 移动到一个单独的助手中。 并将该助手包含回您要使用的控制器my_helper

# app/helpers/params_helper.rb

module ParamsHelper
  def sort_params
    params.permit(:sort).fetch(:sort, nil)
  end
  [...]
end

【讨论】:

  • 您能说得更清楚些吗(例如,将助手包括回控制器,从另一个控制器调用my_helper)?一个更具体的例子会很棒。
【解决方案2】:

最好将辅助方法放在辅助模块中,并在带有view_context 的控制器中使用,如下所示:

module ApplicationHelper
  def fancy_helper(str)
    str.titleize
  end
end

class MyController < ApplicationController
   def index
     @title = view_context.fancy_helper "dogs are awesome"
   end
end

【讨论】:

  • 谢谢,但这并不能回答问题。
【解决方案3】:

一种解决方案是使用 Ruby 元编程:

# app/views/my1/show.html.erb
<%= My2Controller.new.send(:my_helper) %>

但这是一个好的做法还是有更好的做法?

【讨论】:

    【解决方案4】:

    My1ControllerMy2Controller中添加关注,

      include HelperMethods
      helper_method :my_helper1
    

    并在定义的模块中添加方法,

    module HelperMethods
      private
    
      def my_helper
        "Something from My2 controller"
      end
    end
    

    Helper 方法名应该是 uniq 使用相同的控制器所以更新名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多