簡體   English   中英

從控制器調用應用程序助手的最佳方法是什么?

[英]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
  • 在ApplicationController中設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM