我想格式化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 helper_method :format_name
答案 0 :(得分:2)
您可以通过在控制器中包含辅助模块来执行此操作,也可以使用module_function
将辅助方法声明为可直接在模块上调用,类似于类方法。
假设您的辅助函数在此辅助模块中声明:
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])
一样调用辅助函数。
答案 1 :(得分:2)
(将其从评论转移到答案)我建议不要在控制器中执行此格式化,而是使用ActiveModelSerializer来处理它。它是rails-api设置的一部分,现在默认出现在Rails 5中。对于你的情况,你会做类似的事情:
def show
render json: User.find(params[:id)
end
在你的控制器中,你可以做到
{{1}}
答案 2 :(得分:1)
###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