Ruby on rails 3 Rails:因NoMethodError(未定义的方法…)错误而受挫

Ruby on rails 3 Rails:因NoMethodError(未定义的方法…)错误而受挫,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,我有一个模型团队和被描述为部门的部门应该有许多团队: class Team < ActiveRecord::Base belongs_to :division has_attached_file :logo, :styles => { :large => "120x180>", :thumb => "100x100>", :tiny => "25x25>" }, :url => "/assets/images/:st

我有一个模型团队和被描述为部门的部门应该有许多团队:

class Team < ActiveRecord::Base
  belongs_to :division

  has_attached_file :logo, :styles => { :large => "120x180>", :thumb => "100x100>", :tiny => "25x25>" },  
      :url => "/assets/images/:style/teams/#{self.division.name}/:basename.:extension",  
      :path => ":rails_root/public/assets/images/teams/#{self.division.name}/:basename.:extension"
end


class Division < ActiveRecord::Base
  has_many :teams
end
即使使用{self.name}获取团队名称,但它只返回类名:team。在控制台中,我称它们为“很好”:

1.9.3p194 :009 > team = Team.find(4)
  Team Load (0.3ms)  SELECT `teams`.* FROM `teams` WHERE `teams`.`id` = 4 LIMIT 1
 => #<Team id: 4, name: "Arsenal F.C.", league_id: nil, division_id: 1, stadium_id: 2, history: "This is Arsenal F.C. history file", wins: 1, losses: 1, win_percentage: 1.0, created_at: "2012-08-25 09:25:22", updated_at: "2012-08-27 01:54:08", logo_file_size: 29303, logo_updated_at: "2012-08-27 01:54:08", logo_content_type: "image/png", logo_file_name: "arsenal.png"> 
1.9.3p194 :010 > team.name
 => "Arsenal F.C." 
1.9.3p194 :011 > team.division.name
  Division Load (0.3ms)  SELECT `divisions`.* FROM `divisions` WHERE `divisions`.`id` = 1 LIMIT 1
 => "English Premier Division" 
1.9.3p194 :012 > 
我试图在team.rb中调用self.name团队名称或self.division.name团队部门名称,而不是在控制器中

知道为什么吗?因为自己还没有加载?如何解决这个问题

更新:我非常喜欢shioyama的解决方案,因为我们可以将Proc传递给回形针。然而,我的rails_管理员和回形针以及这个解决方案似乎仍然在表单上抛出关于gsub的错误。我找到了另一条可以解决我问题的线索。shioyama的解决方案在没有rails_admin的情况下运行良好。

在类定义中使用self时,它指的是类本身,而不是该类的实例。要获取实例,必须使用lambda:

attachment.instance获取附件所附加到的实例(在本例中为Team类的实例)。看

另见此答案:

1.9.3p194 :009 > team = Team.find(4)
  Team Load (0.3ms)  SELECT `teams`.* FROM `teams` WHERE `teams`.`id` = 4 LIMIT 1
 => #<Team id: 4, name: "Arsenal F.C.", league_id: nil, division_id: 1, stadium_id: 2, history: "This is Arsenal F.C. history file", wins: 1, losses: 1, win_percentage: 1.0, created_at: "2012-08-25 09:25:22", updated_at: "2012-08-27 01:54:08", logo_file_size: 29303, logo_updated_at: "2012-08-27 01:54:08", logo_content_type: "image/png", logo_file_name: "arsenal.png"> 
1.9.3p194 :010 > team.name
 => "Arsenal F.C." 
1.9.3p194 :011 > team.division.name
  Division Load (0.3ms)  SELECT `divisions`.* FROM `divisions` WHERE `divisions`.`id` = 1 LIMIT 1
 => "English Premier Division" 
1.9.3p194 :012 > 
has_attached_file :logo,
  :styles => { :large => "120x180>", :thumb => "100x100>", :tiny => "25x25>" },  
  :url => lamda { |attachment|
    team = attachment.instance
    "/assets/images/:style/teams/#{team.division.name}/:basename.:extension"
  },  
  :path => lambda { |attachment|
    team = attachment.instance
    ":rails_root/public/assets/images/teams/#{team.division.name}/:basename.:extension"
  }