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

时间:2017-04-10 19:34:01

标签: 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>

由于已知原因,控制器中不提供此功能。以下失败:

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

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

我试过了:

  • view_context.format_name
  • 创建部分(例如_view.json.erb)以调用帮助程序并渲染json
  • 在ApplicationController中设置helper_method :format_name

3 个答案:

答案 0 :(得分:2)

您可以通过在控制器中包含辅助模块来执行此操作,也可以使用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])一样调用辅助函数。

答案 1 :(得分:2)

(将其从评论转移到答案)我建议不要在控制器中执行此格式化,而是使用ActiveModelSerializer来处理它。它是rails-api设置的一部分,现在默认出现在Rails 5中。对于你的情况,你会做类似的事情:

def show
  render json: User.find(params[:id)
end

在你的控制器中,你可以做到

{{1}}

答案 2 :(得分:1)

###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