Rails在保存之前访问模型属性

时间:2015-08-22 15:22:46

标签: ruby-on-rails

我在这些通知上有noticescomments。评论也是课堂通知。提交通知后,如果是原始通知,则commentee_id将为空白。如果通知是对另一个通知的评论,则其commentee_id将是其评论通知的ID。

notices_controller.rb:

def create
  @character = Character.find_by(callsign: params[:callsign])
  @notice = @character.notices.build(notice_params)
  if @notice.save
    .
    .
  end
end

def notice_params
  params.require(:notice).permit( :content, :picture, :latitude, :longitude,
                                  active_comment_relationship_attributes: [:commentee_id] )
end

notice.rb:

belongs_to :character

has_one  :active_comment_relationship, class_name: "Commentrelationship",
                                       foreign_key: "commenter_id",
                                       dependent: :destroy
has_one  :supernotice, through: :active_comment_relationship, source: :commentee
accepts_nested_attributes_for :active_comment_relationship

before_validation  :create_commentee

private

  def create_commentee
    if !commentee_id.blank?
      create_active_comment_relationship(commentee_id: :commentee_id)
    end
  end

新通知模型未成功创建。我收到错误消息:

undefined local variable or method `commentee_id' for #<Notice:0x0000010c3a4708>)

调用create_commentee时,新的@notice实例已在内存中创建但尚未保存到数据库中(create_commenteebefore_validation回调)。在此阶段,您如何正确访问commentee_id

这不是(!commentee_id.blank?):

def create_commentee
  if !commentee_id.blank?
    create_active_comment_relationship(commentee_id: :commentee_id)
  end
end

也不是这个(commentee_id不是:commentee_id):

def create_commentee
  if !commentee_id.blank?
    create_active_comment_relationship(commentee_id: commentee_id)
  end
end

有所不同。

1 个答案:

答案 0 :(得分:0)

至少有一个问题是你这样做:

if !:commentee_id.blank?

......当你应该这样做时:

if !commentee_id.blank?

:commentee_id是一个符号,它就像一种特殊的字符串,它永远不会是空白的(好吧,除非它是:"")。您想调用commentee_id方法,即没有:)。

P.S。如果你想稍微习惯一点,我建议改为:

if commentee_id.present?