230

虽然我意识到您应该在视图中使用帮助器,但我需要在控制器中使用帮助器,因为我正在构建要返回的 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助手?

4

10 回答 10

337

您可以使用

  • helpers.<helper>Rails 5+(或ActionController::Base.helpers.<helper>)中
  • view_context.<helper>( Rails 4 & 3 ) (警告:每次调用都会实例化一个新的视图实例)
  • @template.<helper>导轨 2
  • 在单例类中包含助手,然后singleton.helper
  • include控制器中的助手(警告:将使所有助手方法变为控制器操作)
于 2012-06-22T18:00:11.393 回答
222

注意:这是在 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

希望这可以帮助!

于 2011-02-26T23:09:13.770 回答
82

在 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

于 2016-11-04T00:13:12.033 回答
10

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

class ApplicationController < ActionController::Base
  include ApplicationHelper

...
于 2016-02-26T16:11:33.897 回答
9

通常,如果要在(仅)控制器中使用帮助器,我更愿意将其声明为class ApplicationController.

于 2014-03-22T20:48:38.450 回答
4

在 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"
于 2018-12-09T19:43:21.120 回答
4

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

在较新的版本中,您可以在控制器中将助手与助手(复数)对象一起使用。

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

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

于 2021-04-02T08:13:13.143 回答
2

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

class UsersController < ApplicationController
  include UsersHelper
  
  # Your actions

end

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

于 2021-02-01T05:52:28.013 回答
1

其他答案中缺少的一个替代方法是您可以反过来:在控制器中定义您的方法,然后使用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
于 2020-09-15T14:37:40.293 回答
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.number_to_currency(10000)

于 2018-10-08T16:02:17.243 回答