Ruby on rails Rails模型到μs方法
在我的Rails应用程序中,在产品和类别之间定义了一种关系。每种产品可以有不同的类别 我以以下方式显示产品类别:Ruby on rails Rails模型到μs方法,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,在我的Rails应用程序中,在产品和类别之间定义了一种关系。每种产品可以有不同的类别 我以以下方式显示产品类别: <p> <strong>Categories:</strong> <%= @product.categories.join(", ") unless @product.categories.nil? %> </p> 但是,在“显示”页面中,类别显示如下: Categories: #<Category:
<p>
<strong>Categories:</strong>
<%= @product.categories.join(", ") unless @product.categories.nil? %>
</p>
但是,在“显示”页面中,类别显示如下:
Categories: #<Category:0x007f2bf515b148>, #<Category:0x007f2bf515aef0>, #<Category:0x007f2bf515ac98>
类别:#,##
为什么
to_s
方法不起作用?如何解决此问题?product.categories的结果是一个ActiveRecord::Relation
,而不是一个数组。因此,join
方法是在关系类内部实现的,而不是数组#join
您应该隐式地将列表强制转换为数组
<%= @product.categories.to_a.join(", ") unless @product.categories.nil? %>
此外,.nil?
检查是完全无用的,因为@product.categories
是一种关系,永远不会为零
如果你真的想写更好的代码,你可以避免在视图中实现你的逻辑,你可以依靠助手和模型
class Product
def category_names
categories.pluck(:name)
end
end
module ProductsHelper
def product_categories_list(product)
product.category_names.to_sentence
end
end
<%= product_categories_list(@product) %>
类产品
def类别名称
类别。拔毛(:名称)
结束
结束
模块产品搁置器
def产品类别列表(产品)
product.category\u name.to\u语句
结束
结束
尝试定义如下方法:
class Category < ActiveRecord::Base
def to_s
self.name
end
end
类别
要访问属性,如果它是表中的一列,则不应使用@attr\u名称,因为它们不会存储为实例变量
尝试将重新定义为方法,如下所示:
class Category < ActiveRecord::Base
def to_s
name
end
end
我做了一个实验来找出问题所在,我建议你看看结果
这是一个pry
REPL的输出。这不是一个Rails模型,但它指出了问题所在
我所做的:我定义了一个新类,并指示它输出对其调用的任何不存在的方法的名称。这是确定类的隐式调用的一个简便技巧
[1] pry(main)> class Hi
[1] pry(main)* def method_missing(sym)
[1] pry(main)* puts sym
[1] pry(main)* end
[1] pry(main)* end
=> :method_missing
[2] pry(main)> a = [Hi.new, Hi.new]
=> [#<Hi:0x0000000405b028>, #<Hi:0x0000000405afd8>]
[3] pry(main)> a.join
to_str
to_str
to_ary
to_str
to_ary
=> "#<Hi:0x0000000405b028>#<Hi:0x0000000405afd8>"
[1]撬(主)>高等级
[1] 撬(主)*def方法_缺失(sym)
[1] 撬动(主)*放置sym
[1] 撬(主)*端
[1] 撬(主)*端
=>:方法_缺失
[2] 撬(主)>a=[Hi.new,Hi.new]
=> [#, #]
[3] 撬(主)>a.连接
托鲁街
托鲁街
到
托鲁街
到
=> "##"
它不是到
。显然,这就是所谓的“代码”。你想展示什么?产品类别名称?如果要显示类别名称,则无需使用@符号传递与否没有区别<代码>自我
对于读者来说在Ruby中是隐式的和冗余的。
class Category < ActiveRecord::Base
def to_s
self.name
end
end
class Category < ActiveRecord::Base
def to_s
name
end
end
class Role < ActiveRecord::Base
def to_s
nil
end
end
"#{Role.first}"
=> "#<Role:0x00000007a39f88>"
Role.first.to_s
=> nil
[1] pry(main)> class Hi
[1] pry(main)* def method_missing(sym)
[1] pry(main)* puts sym
[1] pry(main)* end
[1] pry(main)* end
=> :method_missing
[2] pry(main)> a = [Hi.new, Hi.new]
=> [#<Hi:0x0000000405b028>, #<Hi:0x0000000405afd8>]
[3] pry(main)> a.join
to_str
to_str
to_ary
to_str
to_ary
=> "#<Hi:0x0000000405b028>#<Hi:0x0000000405afd8>"