当我意识到你应该在视图中使用帮助器时,我需要在我的控制器中有一个帮助器,因为我正在构建一个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
帮助程序?
答案 0 :(得分:271)
您可以使用
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对不同答案的评论。我觉得他的答案应该得到答案,因为它是最简洁,最容易的解决方案。
答案 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