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

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)来调用助手并渲染 json
  • helper_method :format_name在应用程序控制器中设置

Fro*_*ost 5

您可以通过在控制器中包含辅助模块来实现此目的,也可以将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])


chr*_*son 5

(将其从评论移至答案)我建议不要在控制器中执行此格式化,而是使用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)