在authors_controller.rb
中,我有这个:
def show
a = Author.find(params[:id])
@author = a.map { |e| e.titlecase }
end
我收到错误,说地图是作者:: 0x007fec244142a0的未定义方法。
我也试过这个:
def show
@author = Author.find(params[:id])
@author.each { |k, v| v.capitalize }
end
如何将方法标题应用于Author.find的每个值?
答案 0 :(得分:0)
find(params[:id])
不是数组,不是枚举,不是Relation类,而只是模型的实例。您无法使用map
或each
,因此只需将titlecase
应用于返回的对象。
def show
@author = Author.find(params[:id])
@author.name = @author.name.titlecase # if you have column 'name'
end
但最好将带有名称的名称移到模型的方法上,或者只需使用@author.name.titlecase
即可。
您可以使用where
并使用map
运算符:
def show
@author = Author.where(id: params[:id])
答案 1 :(得分:0)
它很难看,但它有效。我确信有更好的方法来做这些事情。
@author.attributes.map do |k,v|
v = @author.__send__(k).capitalize if @author.__send__(k).respond_to?(:capitalize)
end
@author.save
但我必须说,我不建议这样做。更好地利用模型中的每个字段
答案 2 :(得分:0)
从我的理解。您想要将记录Author.find(params[:id])
的所有字段都大写吗?
首先,Author.find(params[:id])
将返回记录,而不是数组。这意味着您无法使用each
或map
。
大写记录的所有字段。你可以尝试:
def show
author = Author.find(params[:id])
@author = author.attributes.values.map{|field| field.to_s.capitalize}
end
它将返回所有字段值的数组。
更新1
为了更好
def show
author = Author.find(params[:id])
@author_info = author.attributes.values.map{|field| field.is_a?(String) ? field.capitalize : field}
end