vol*_*ron 2 ruby-on-rails view-helpers
我想格式化 JSON 响应的值,使其与视图中的显示方式相同。
考虑对象,user = { id: 323 };创建了一个辅助方法 ( format_name) 以使该值在视图中更容易呈现:
<div>
<%= format_name(user[:id]) %>
<% # appears as: <span class="user" data-user-id="323">John Doe</span> %>
</div>
Run Code Online (Sandbox Code Playgroud)
由于已知原因,这在控制器中不可用。以下失败:
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
Run Code Online (Sandbox Code Playgroud)
我很好奇如何在控制器中使用辅助方法。
我试过了:
view_context.format_name _view.json.erb)来调用助手并渲染 jsonhelper_method :format_name在应用程序控制器中设置您可以通过在控制器中包含辅助模块来实现此目的,也可以将module_function辅助方法声明为可直接在模块上调用,有点像类方法。
假设您的辅助函数在此辅助模块中声明:
module ApplicationHelper
def format_name(user_id)
# do stuff
end
module_function :format_name # Here's the "magic" line
end
Run Code Online (Sandbox Code Playgroud)
通过添加该行,您现在可以像在控制器中module_function :format_name一样调用辅助函数。ApplicationHelper.format_name(user[:id])
(将其从评论移至答案)我建议不要在控制器中执行此格式化,而是使用ActiveModelSerializer来处理它。它是 Rails-api 设置的一部分,现在默认在 Rails 5 中提供。根据您的情况,您可以执行以下操作:
class UserSerializer < ActiveModel::Serializer
include ApplicationHelper
attributes :id, :formatted
def formatted
format_name(object)
end
end
Run Code Online (Sandbox Code Playgroud)
在你的控制器中,你可以这样做
def show
render json: User.find(params[:id)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4997 次 |
| 最近记录: |