从控制器调用应用程序助手的最佳方式是什么?
What's the best way to call an application helper from a controller?
我想格式化 JSON 响应的值,使其与在视图中的显示方式相同。
考虑对象,user = { id: 323 }
;已创建辅助方法 (format_name
) 以使值在视图中更易于呈现:
<div>
<%= format_name(user[:id]) %>
<% # appears as: <span class="user" data-user-id="323">John Doe</span> %>
</div>
由于已知原因,这在控制器中不可用。以下失败:
class ApplicationHelper
def format_name
# ...
end
end
class UserController < ApplicationController
def view
# ...<setup user info>...
user_formatted = {
id: user[:id],
formatted: format_name(user[:id]) # helper method
}
respond_to do |format|
format.json { render json: user_formatted.to_json }
end
end
end
我很好奇如何在控制器中使用辅助方法。
我试过:
view_context.format_name
- 创建部分(例如,
_view.json.erb
)以调用助手并呈现 json
- 在 ApplicationController
中设置 helper_method :format_name
您可以通过在控制器中包含您的辅助模块来实现这一点,或者您可以使用 module_function
将您的辅助方法声明为可直接在模块上调用,有点像 class 方法.
说你的辅助函数是在这个辅助模块中声明的:
module ApplicationHelper
def format_name(user_id)
# do stuff
end
module_function :format_name # Here's the "magic" line
end
通过添加 module_function :format_name
行,您现在可以像在控制器中调用 ApplicationHelper.format_name(user[:id])
一样调用辅助函数。
###helper
module MyHelper
def format_name(user_id)
#code goes here
end
end
###html
<div>
<%= format_name(user[:id]) %>
</div>
###controller
class SampleController < ApplicationController
include MyHelper
def view
puts format_name(user[:id])
end
end
(将此从评论移至答案)我建议不要在您的控制器中进行这种格式化,而是使用 ActiveModelSerializer 来处理它。它是 rails-api 设置的一部分,现在默认在 Rails 中发布 5. 根据您的情况,您可以执行以下操作:
class UserSerializer < ActiveModel::Serializer
include ApplicationHelper
attributes :id, :formatted
def formatted
format_name(object)
end
end
在你的控制器中,你可以做
def show
render json: User.find(params[:id)
end
我想格式化 JSON 响应的值,使其与在视图中的显示方式相同。
考虑对象,user = { id: 323 }
;已创建辅助方法 (format_name
) 以使值在视图中更易于呈现:
<div>
<%= format_name(user[:id]) %>
<% # appears as: <span class="user" data-user-id="323">John Doe</span> %>
</div>
由于已知原因,这在控制器中不可用。以下失败:
class ApplicationHelper
def format_name
# ...
end
end
class UserController < ApplicationController
def view
# ...<setup user info>...
user_formatted = {
id: user[:id],
formatted: format_name(user[:id]) # helper method
}
respond_to do |format|
format.json { render json: user_formatted.to_json }
end
end
end
我很好奇如何在控制器中使用辅助方法。
我试过:
view_context.format_name
- 创建部分(例如,
_view.json.erb
)以调用助手并呈现 json - 在 ApplicationController 中设置
helper_method :format_name
您可以通过在控制器中包含您的辅助模块来实现这一点,或者您可以使用 module_function
将您的辅助方法声明为可直接在模块上调用,有点像 class 方法.
说你的辅助函数是在这个辅助模块中声明的:
module ApplicationHelper
def format_name(user_id)
# do stuff
end
module_function :format_name # Here's the "magic" line
end
通过添加 module_function :format_name
行,您现在可以像在控制器中调用 ApplicationHelper.format_name(user[:id])
一样调用辅助函数。
###helper
module MyHelper
def format_name(user_id)
#code goes here
end
end
###html
<div>
<%= format_name(user[:id]) %>
</div>
###controller
class SampleController < ApplicationController
include MyHelper
def view
puts format_name(user[:id])
end
end
(将此从评论移至答案)我建议不要在您的控制器中进行这种格式化,而是使用 ActiveModelSerializer 来处理它。它是 rails-api 设置的一部分,现在默认在 Rails 中发布 5. 根据您的情况,您可以执行以下操作:
class UserSerializer < ActiveModel::Serializer
include ApplicationHelper
attributes :id, :formatted
def formatted
format_name(object)
end
end
在你的控制器中,你可以做
def show
render json: User.find(params[:id)
end