[英]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
我很好奇如何在控制器中使用helper方法。
我試過了:
view_context.format_name
_view.json.erb
)以調用幫助程序並呈現json helper_method :format_name
(將其從注釋移至答案)我建議不要在控制器中進行這種格式化,而應使用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
您可以通過在控制器中包括幫助程序模塊來執行此操作,也可以使用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])
一樣調用您的幫助器函數。
###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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.