未定义方法的虚拟属性问题

时间:2009-09-16 10:30:37

标签: ruby-on-rails ruby attributes virtual

我过去曾使用虚拟属性,但似乎无法解决这个问题,而且我知道答案可能正在盯着我。

我有一个这样的模型:

model Confirmation.rb

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

的平均脚手架控制器

confirmations_controller.rb

  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

new.html.erb

<h1>New confirmation</h1>

<% form_for(@confirmation) do |f| %>
  <%= f.error_messages %>

    <%= f.hidden_field :confirmation_token %>

...

的routes.rb

  map.confirmation "confirmation/:confirmation_token", :controller => "confirmations", :action => "new"
  map.resources :confirmations

错误

对于#

未定义的方法`confirmation ='

在控制台中,带有给定令牌的Booking.find_by_confirmation_token(令牌)完全正常。

有什么想法吗?建议?

3 个答案:

答案 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仍然返回未定义的方法...