Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails模型到μs方法_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails模型到μs方法

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:

在我的Rails应用程序中,在产品和类别之间定义了一种关系。每种产品可以有不同的类别

我以以下方式显示产品类别:

<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>"