2012-08-09 79 views
2

我正在使用ryanb的nested_form gem for Rails 3,並試圖訪問在窗體中傳遞的對象,以便我可以標記由表單生成器生成的字段。Ruby on Rails form.object不響應對象方法:對於nil的undefined方法:NilClass

我有以下的基本結構:

Trainer has_many :clients, through: :relationships 
Trainer has_many :schedules 

Client has_many :trainers, through: :relationships 
Client has_many :schedules 

爲客戶機#編輯頁面我的看法代碼:

<% provide(:title, @client.name) %> 
<h2><%= link_to @client.name, @client %></h2> 

<%= render :partial => 'shared/errors', :locals => { :user => @client } %> 

<%= nested_form_for @client do |f| %> 

<p><%= f.link_to_add "Add Schedule", :schedules %></p> 

<%= f.fields_for :schedules do |schedule_form| %> 

     <%= schedule_form.object.trainer.name %> 

    <%= schedule_form.date_select :scheduled_date %> 
    <%= schedule_form.link_to_remove "Remove" %> 

    <%= schedule_form.hidden_field :trainer_id %> 
    <%= hidden_field_tag :trainer_id %> 

    <% end %> 

<br><%= f.submit "Create", class: 'btn btn-large btn-primary' %></br> 
<% end %> 

<%= schedule_form.object.trainer.name %>拋出一個​​錯誤。

這是它變得奇怪的地方。我要後下,我修改該行一對夫婦的情況,然後張貼在頁面上的輸出:

<%= schedule_form.object.trainer %> 
<Trainer:0x007fdcedf3f800> 

<%= schedule_form.object.trainer.class %> 
Trainer 

<%= schedule_form.object.trainer.is_a?(Object) %> 
true 

<%= schedule_form.object.trainer.respond_to?(:name) %> 
true 

<%= schedule_form.object.trainer.name %> 
undefined method 'name' for nil:NilClass 

<%= t_id = schedule_form.object.trainer_id %> 
1 
<%= Trainer.find(t_id) %> 

<%= t_id = schedule_form.object.trainer_id %> 
1 
<%= Trainer.find_by_id(t_id) %> 
#<Trainer:0x007fdcedf09660> 

<%= t_id = schedule_form.object.trainer_id %> 
1 
<%= Trainer.find_by_id(t_id).name %> 
undefined method 'name' for nil:NilClass 

所以基本上 - 我可以使用表單生成器來檢索:日程安排對象,並可以查詢檢索教練對象(schedule.trainerschedule.trainer_id);但是,trainer對象不會響應任何實例方法,即使它只是我能夠告訴的那個類Trainer的一個對象。

我該如何返回trainer.name?這就是我想要的:一個標籤。請幫忙。

編輯:新增訓練模式

class Trainer < ActiveRecord::Base 
    attr_accessible :email, :name, :password, :password_confirmation 
    has_secure_password 
    has_many :relationships 
    has_many :clients, through: :relationships 
    has_many :schedules 

    validates :name, presence: true 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, 
                   uniqueness: { case_sensitive: false } 
    validates :password, presence: true, length: { minimum: 6 }, on: :create 
    validates :password_confirmation, presence: true, length: { minimum: 6 }, on: :create 

    before_save { |trainer| trainer.email = email.downcase } 

end 

編輯 - 後來添加。

我嘗試使用下面的代碼和它的工作如預期:

<%= t_id = 1 %> 
<%= Trainer.find(t_id).name %> 

返回

Joe Trainer 

但是:

<%= t_id = schedule_form.object.trainer_id %> 
    > 1 
<%= Trainer.find(t_id) %> 
    > Couldn't find Trainer without an ID 
<%= Trainer.find_by_id(t_id) %> 
    > #<Trainer:0x007fea86b9a168> 
<%= Trainer.find_by_id(t_id).name %> 
    > undefined method 'name' for nil:NilClass 

因此很明顯,有一些 '微胖' 與任何從schedule_form.object返回。有沒有辦法採取t_id = schedule_form.object.trainer_id並對其進行消毒,使我擁有的只是一個純粹的整數,而不受任何以前的歷史的影響?

+0

您是否試過<%= schedule_form.object.trainer.nil? %>我承認這是奇怪的行爲。 – Joeyjoejoejr 2012-08-09 11:52:58

+0

我看到的另一件事很奇怪的是,你的has_many:through關係並沒有設定我期望的。我希望看到它設置爲客戶端has_many:培訓者,:雖然=>:時間表。現在是:通過=>:關係。你有一個關係模型嗎? – Joeyjoejoejr 2012-08-09 11:56:50

+0

看起來很奇怪。你能爲你的教練員課程或完整的堆棧跟蹤提供代碼嗎? – 2012-08-09 12:01:48

回答

0

您的代碼在Schedule對象上失敗,但您不會發布該模型。

它最有可能崩潰,因爲您沒有使用@ trainer.schedules.create創建計劃,但使用了Schedule.create或Schedule.new ...然後教練屬性未初始化,因此爲零。

+0

我正在使用client.update_attributes來更新所有的時間表。即使對於已保存到數據庫的對象,培訓人員屬性也會返回零。然而,schedule_form.object.trainer_id返回正確的ID - 你有什麼想法,爲什麼我不能根據這個搜索培訓師? Trainer.find不應該依賴於正在初始化的時間表。 – Stuart 2012-08-13 02:32:10

相關問題