我过去曾使用虚拟属性,但似乎无法解决这个问题,而且我知道答案可能正在盯着我。
我有一个这样的模型:
class Confirmation < ActiveRecord::Base
#attr_accessible :confirmation, :confirmation_token
#attr_accessible :confirmation_token
def confirmation_token
confirmation.confirmation_token if confirmation
end
def confirmation_token=(token)
self.confirmation = Booking.find_by_confirmation_token(token)
end
end
的平均脚手架控制器
def new
@confirmation = Confirmation.new(:confirmation_token => params[:confirmation_token])
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @confirmation }
end
end
<h1>New confirmation</h1>
<% form_for(@confirmation) do |f| %>
<%= f.error_messages %>
<%= f.hidden_field :confirmation_token %>
...
map.confirmation "confirmation/:confirmation_token", :controller => "confirmations", :action => "new"
map.resources :confirmations
未定义的方法`confirmation ='
在控制台中,带有给定令牌的Booking.find_by_confirmation_token(令牌)完全正常。
有什么想法吗?建议?
答案 0 :(得分:5)
你真正需要的是attr_accessor:确认。 attr_accessible和attr_accessor之间存在差异。
attr_accessor :confirmation
与
相同def confirmation
@confirmation
end
def confirmation=(value)
@confirmation = value
end
现在因为它是如此常见的模式,ruby为此引入了辅助方法。
另一方面,Attr_accesible是rails方法,它标记某些字段可以进行批量更新。
答案 1 :(得分:2)
我认为它应该是:
def confirmation_token=(token)
@confirmation = Booking.find_by_confirmation_token(token)
end
或者您应该取消注释attr_accessible :confirmation
或定义#confirmation
和#confirmation=
。
答案 2 :(得分:0)
class Confirmation < ActiveRecord::Base
belongs_to :bookings
#attr_accessible :confirmation, :confirmation_token
#attr_accessible :confirmation
def confirmation_token
@confirmation.confirmation_token if @confirmation
end
def confirmation_token=(token)
@confirmation = Booking.find_by_confirmation_token(token)
end
end
这有效...但是只是发现了attr_accessible:确认,没有。 self.confirmation仍然返回未定义的方法...