rails controller地图未知

时间:2016-12-19 20:21:26

标签: ruby-on-rails methods controller

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的每个值?

3 个答案:

答案 0 :(得分:0)

find(params[:id])不是数组,不是枚举,不是Relation类,而只是模型的实例。您无法使用mapeach,因此只需将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])将返回记录,而不是数组。这意味着您无法使用eachmap

大写记录的所有字段。你可以尝试:

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