Как использовать в представлениях вспомогательный метод контроллера из другого контроллера? - PullRequest
0 голосов
/ 21 января 2019

У меня есть два контроллера с вспомогательным методом, который имеет одно и то же имя, но возвращает разные вещи:

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

В представлении app/views/my1/show.html.erb, связанном с My1Controller, я хотел бы использовать возвращаемое значение my_helper от My2Controller.

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 21 января 2019

Добавить следующий в My1Controller & My2Controller,

  include HelperMethods
  helper_method :my_helper1

И добавить метод в определенном модуле,

module HelperMethods
  private

  def my_helper
    "Something from My2 controller"
  end
end

Имя вспомогательного метода должно быть уникальным, если используется тот же контроллер, поэтому обновите имя

0 голосов
/ 21 января 2019

Лучше всего поместить вспомогательный метод в вспомогательный модуль и использовать его в контроллере с 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
0 голосов
/ 21 января 2019

Решением является использование метапрограммирования Ruby:

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

Но это хорошая практика или есть что-то лучшее?

0 голосов
/ 21 января 2019

Переместите my_helper в отдельного помощника.и включите этого помощника обратно в контроллер, где вы хотите использовать my_helper

# app/helpers/params_helper.rb

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