0

モデルのチームと部門があり、部門には多くのチームが必要であると説明されています。

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.division.name}まったく機能しません。

与えられたエラー:

NoMethodError (undefined method `division' for #<Class:0x007f80179b68f8>):

チームの名前を取得するために使用#{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

理由はありますか?自己がまだロードされていないためですか?これを解決するには?

更新: Proc を paperclip に渡すことができるため、shioyama のソリューションが本当に気に入っています。ただし、私の rails_admin と paperclip とこのソリューションは、フォームの gsub に関するエラーをまだスローしているようです。私の問題をカバーする別のスレッドDynamic use of :default_url in Paperclipを見つけました。shioyama のソリューションは、rails_admin がなくても問題なく動作します。

4

1 に答える 1

2

クラス定義内で使用するselfと、そのクラスのインスタンスではなく、クラス自体を参照します。インスタンスを取得するには、次を使用する必要がありますlambda

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

attachment.instance添付ファイルが添付されているインスタンス (この場合はTeamクラスのインスタンス) を取得します。クリップのドキュメントを参照してください。

この回答も参照してください:レールでラムダに自己を渡すことができますか?

于 2012-08-27T02:46:47.910 に答える