Rails - 如何在控制器内使用帮助程序

时间:2011-02-26 22:31:59

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-5

当我意识到你应该在视图中使用帮助器时,我需要在我的控制器中有一个帮助器,因为我正在构建一个JSON对象来返回。

有点像这样:

def xxxxx

   @comments = Array.new

   @c_comments.each do |comment|
   @comments << {
     :id => comment.id,
     :content => html_format(comment.content)
   }
   end

   render :json => @comments
end

如何访问我的html_format帮助程序?

10 个答案:

答案 0 :(得分:271)

您可以使用

    Rails 5 + (或helpers.<helper>)中的
  • ActionController::Base.helpers.<helper>
  • view_context.<helper> Rails 4&amp; 3 )(警告:这会为每次调用实例化一个新的视图实例)
  • @template.<helper> Rails 2
  • 在单例类中包含帮助器,然后包含singleton.helper
  • include控制器中的帮助器(警告:将所有辅助方法转换为控制器操作)

答案 1 :(得分:199)

注意:这是在Rails 2天写回来的;如今格罗瑟的答案(下面)是要走的路。

选项1:可能最简单的方法是在控制器中包含辅助模块:

class MyController < ApplicationController
  include MyHelper

  def xxxx
    @comments = []
    Comment.find_each do |comment|
      @comments << {:id => comment.id, :html => html_format(comment.content)}
    end
  end
end

选项2:或者您可以将辅助方法声明为类函数,并像这样使用它:

MyHelper.html_format(comment.content)

如果您希望能够将它同时用作实例函数和类函数,则可以在助手中声明这两个版本:

module MyHelper
  def self.html_format(str)
    process(str)
  end

  def html_format(str)
    MyHelper.html_format(str)
  end
end

希望这有帮助!

答案 2 :(得分:77)

在Rails 5中使用控制器中的helpers.helper_function

示例:

def update
  # ...
  redirect_to root_url, notice: "Updated #{helpers.pluralize(count, 'record')}"
end

来源:来自@Markus对不同答案的评论。我觉得他的答案应该得到答案,因为它是最简洁,最容易的解决方案。

参考:https://github.com/rails/rails/pull/24866

答案 3 :(得分:11)

使用选项1解决了我的问题。可能最简单的方法是在控制器中包含辅助模块:

class ApplicationController < ActionController::Base
  include ApplicationHelper

...

答案 4 :(得分:9)

通常,如果要在(仅)控制器中使用帮助器,我更喜欢将其声明为class ApplicationController的实例方法。

答案 5 :(得分:1)

在Rails 5+中,您可以简单地使用以下示例中演示的功能:

module ApplicationHelper
  # format datetime in the format #2018-12-01 12:12 PM
  def datetime_format(datetime = nil)
    if datetime
      datetime.strftime('%Y-%m-%d %H:%M %p')
    else
      'NA'
    end
  end
end

class ExamplesController < ApplicationController
  def index
    current_datetime = helpers.datetime_format DateTime.now
    raise current_datetime.inspect
  end
end
  

输出

"2018-12-10 01:01 AM"

答案 6 :(得分:0)

class MyController < ApplicationController
    # include your helper
    include MyHelper
    # or Rails helper
    include ActionView::Helpers::NumberHelper

    def my_action
      price = number_to_currency(10000)
    end
end

在Rails 5+中,只需使用 helpers helpers.number_to_currency(10000)

答案 7 :(得分:0)

其他答案中缺少的一种替代方法是,您可以采用另一种方法:在Controller中定义方法,然后使用helper_method使它也可以作为辅助方法在视图上使用。

例如:


class ApplicationController < ActionController::Base

private

  def something_count
    # All other controllers that inherit from ApplicationController will be able to call `something_count`
  end
  # All views will be able to call `something_count` as well
  helper_method :something_count 

end

答案 8 :(得分:0)

在 rails 6 中,只需将其添加到您的控制器中:

class UsersController < ApplicationController
  include UsersHelper
  
  # Your actions

end

现在 user_helpers.rb 将在控制器中可用。

答案 9 :(得分:0)

在 Rails 5 之前,您必须包含 helper 模块。

在较新的版本中,您可以在控制器中使用 helpers(复数)对象来使用 helpers。

  class UsersController
    def index
      helpers.my_helper_method_name(even_pass_arg_here)
    end
  end

https://www.rubyguides.com/2020/01/rails-helpers/