从控制器调用应用程序助手的最佳方式是什么?

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

我很好奇如何在控制器中使用辅助方法。

我试过:

您可以通过在控制器中包含您的辅助模块来实现这一点,或者您可以使用 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