Ruby on rails 什么';从控制器调用应用程序助手的最佳方式是什么?
我希望格式化JSON响应的值,使其与视图中的值相同 考虑对象,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> 由于已
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
- 创建一个部分(例如,
)来调用帮助程序并呈现json\u view.json.erb
- 在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?
,这是一条未定义的消息。由于这似乎是一个独立的问题,我想这已经足够好了。这很有帮助,我之所以没有选择它,是因为我认为它向控制器公开了所有功能,而选择的答案似乎在防止副作用方面做得更好。不过,我相信这种方法可以适应这种情况