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

Ruby on rails 什么';从控制器调用应用程序助手的最佳方式是什么?,ruby-on-rails,view-helpers,Ruby On Rails,View Helpers,我希望格式化JSON响应的值,使其与视图中的值相同 考虑对象,user={id:323};已创建一个帮助器方法(format\u name),以使该值在视图中更易于显示: <div> <%= format_name(user[:id]) %> <% # appears as: <span class="user" data-user-id="323">John Doe</span> %> </div> 由于已

我希望格式化JSON响应的值,使其与视图中的值相同

考虑对象,
user={id:323}
;已创建一个帮助器方法(
format\u 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
类ApplicationHelper
def格式\u名称
# ...
结束
结束
类UserController
我很好奇如何在控制器中使用helper方法

###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
我试过:

  • view\u context.format\u name
  • 创建一个部分(例如,
    \u view.json.erb
    )来调用帮助程序并呈现json
  • 在ApplicationController中设置
    helper\u方法:格式化\u名称

您可以通过将助手模块包含在控制器中,或者使用
module\u函数
将助手方法声明为可直接在模块上调用,有点像类方法

假设您的助手函数在此助手模块中声明:

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
###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
模块MyHelper def格式名称(用户id) #代码在这里 结束 结束 ###html ###控制器 类SampleController<应用程序控制器 包括我的助手 def视图 放置格式\u名称(用户[:id]) 结束 结束
(将此从注释移动到答案)我建议不要在控制器中执行此格式化,而是使用来处理它。它是rails api设置的一部分,现在默认情况下在rails 5中提供。对于您的情况,您可以执行以下操作:

class UserSerializer < ActiveModel::Serializer
  include ApplicationHelper

  attributes :id, :formatted

  def formatted
    format_name(object)
  end
end

我将是今天的唯一:)。对于您描述的用例,您应该使用序列化库,例如。在控件中格式化JSON通常是不好的做法。可以在序列化程序中使用视图帮助器(可以将其视为JSON的“视图”)。它使格式化代码远离控制器。@chrismasanderson自从我做了大量Rails开发以来,这已经是一段漫长的时间了;我欢迎任何明智的建议。那么一定要看看AMS。它现在是Rails api的默认序列化程序,并且是Rails api设置的一部分。对不起,
format\u name
在控制器中不可用的已知原因是什么。@AlejandroMontilla如果我正确理解您的问题,就我所能记得的,帮助程序主要用于视图,除非以某种方式明确说明,我正试图通过我的问题弄清楚这一点。
MyHelper
来自哪里?那是另一个模块吗?
ApplicationHelper.format\u name
对不起,我的错误。我忘了更新我答案的那一部分。编辑:它现在更新了。啊,我试过了,但出现了一个错误,但我认为这与帮助函数有关。。。现在检查一下,thxAs您在上面的代码示例中编写了helper函数,它缺少一个参数,但是您使用一个参数调用它。如果您编写的示例与代码完全相同,这可能就是原因。否则,它可能只是一些逻辑错误。哦,如果您在助手函数中使用任何实例变量(
@something
),您可能必须替换它们,因为助手函数的作用域与控制器的作用域不同。我没有,但我遇到了一个块,因为我在助手中使用了
allow?
,这是一条未定义的消息。由于这似乎是一个独立的问题,我想这已经足够好了。这很有帮助,我之所以没有选择它,是因为我认为它向控制器公开了所有功能,而选择的答案似乎在防止副作用方面做得更好。不过,我相信这种方法可以适应这种情况