我正在使用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.trainer
或schedule.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
並對其進行消毒,使我擁有的只是一個純粹的整數,而不受任何以前的歷史的影響?
您是否試過<%= schedule_form.object.trainer.nil? %>我承認這是奇怪的行爲。 – Joeyjoejoejr 2012-08-09 11:52:58
我看到的另一件事很奇怪的是,你的has_many:through關係並沒有設定我期望的。我希望看到它設置爲客戶端has_many:培訓者,:雖然=>:時間表。現在是:通過=>:關係。你有一個關係模型嗎? – Joeyjoejoejr 2012-08-09 11:56:50
看起來很奇怪。你能爲你的教練員課程或完整的堆棧跟蹤提供代碼嗎? – 2012-08-09 12:01:48