2

我想使用虛擬屬性將Simple_forms合併到我的應用程序中。我正在關注http://railscasts.com/episodes/102-auto-complete-association-revised以獲得自動完成功能。 Simple_form在我不使用虛擬屬性時起作用,但當我使用虛擬屬性時,出現「Association:head_coach_name not found」錯誤。使用虛擬屬性的rails simple_form

我的團隊模式是:

class Team < ActiveRecord::Base 
    attr_accessor :head_coach_name 
    belongs_to :user 
    validates :team_name, presence: true 
    belongs_to :head_coach, class_name: "User", :foreign_key => "head_coach_id" 

    def head_coach_name 
    user.try(:name) 
    end 

    def head_coach_name=(name) 
    self.user = User.find_by_name(name) if name.present? 
    end 
end 

我的用戶模型爲:

class User < ActiveRecord::Base 
    has_many :teams, :class_name => "::Team", dependent: :destroy 
end 

筆者認爲:

   <%= simple_form_for @team, html: {class: 'form-horizontal' }, url: teams_path, method: 'post' do |f| %>  
       <%= f.error_notification %>   
       <%= f.hidden_field :user_id %>     
       <div class="col-md-6"> 
        <div class="row"> 
         <div class="col-md-12">       
           <%= f.input :team_name, class: "form-control" %>   
           <%= f.input :year, collection: Date.today.year-90..Date.today.year %> 
           <%= f.input :season, as: :select, collection: 
            ['Fall', 
            'Winter', 
            'Spring', 
            'Summer'] %>       
           <%= f.input :season_type, as: :select, collection: 
            ['Outdoor', 
            'Indoor', 
            'Tournament'] %> 
           <%= f.input :awards %> 
         </div> 
        </div> 
       </div> 
       <div class="col-md-6"> 
        <div class="row"> 
         <div class="col-md-12">   
           <%= f.input :club %>   
           <%= f.input :division %> 
           <%= f.association :head_coach_name %>      
           <%= f.input :assistant_coach_id %>   
           <%= f.input :assistant_coach_two_id %> 
          </div>            
         </div> 
        </div>   
       <%= f.button :submit, label: "Add team", class: "btn btn-large btn-primary col-md-3 pull-right" %> 
       <% end %> 

一切工作只要我沒有虛擬那裏有關聯。我可以把:head_coach,它會與下拉列表一起工作,但我想使用像railscast視頻中的自動完成功能。同樣在導軌控制檯我可以運行這些命令來顯示虛擬屬性適用於:

2.1.2 :003 > team.head_coach_name 
    User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 100 LIMIT 1 
=> "Miss Daisha Shanahan" 

我如何能得到虛擬屬性與simple_forms正常工作任何想法?

回答

0

您正在引用與f.association :head_coach_name不存在的關聯。試試這個:

f.association :head_coach, label_method: :head_coach_name 

你在你的代碼的一些其他奇怪的,包括你的head_coach_name定義,它應該依靠head_coach而不是用戶。同樣關注head_coach_name=方法。

例子。您有:

def head_coach_name 
    user.try(:name) 
end 

好像你應該有:

def head_coach_name 
    head_coach.try(:name) 
end 
+0

謝謝。這解決了我未發現的關聯問題。我對軌道上的紅寶石很陌生。你能否詳細談談你談論的古怪事物? @steel – Mike 2014-11-26 15:46:01

+0

當然,@Mike。我添加了一個例子。如果你是Rails的新手,很好的使用.try()。 – steel 2014-11-26 16:13:00