【问题标题】:Rails - why does this before_save trigger on create but not update?Rails - 为什么这个 before_save 在创建但不更新时触发?
【发布时间】:2023-03-13 07:02:02
【问题描述】:

我的模型有:

class Link < ActiveRecord::Base

  belongs_to :group
  validates_presence_of :url_address
  validates_presence_of :group_id
  before_save :verify_url
  acts_as_list

  def valid_get?
    HTTParty.get(url_address).code.between?(100,399) ? true : false
  rescue SocketError, URI::InvalidURIError
    false
  end 

  def verify_url
    if valid_get?
      verified_date = Time.now
    end 
  end 

end

当我通过表单创建记录时,verified_date 被正确设置为今天的日期。

为什么字段不更新记录的更新?

控制器:

class LinksController < ApplicationController

  before_filter :authorize, :except => [:index, :show, :advanced_search]

  ...

  def verify_link # Used by js. works fine to update the field.
    @link = Link.find(params[:id])
    if @link.valid_get?
      if @link.update_attribute(:verified_date, Time.now)
        render nothing: true, status: 200
      else
        render nothing: true, status: 422
      end
    else
      render nothing: true, status: 422
    end
  end

  def create # Used via the HTML form.  method should update verified_date but doesn't
    @link = Link.new(params[:link])
    @link.content_date = Time.new().strftime("%m/%d/%Y") if @link.content_date.nil?
    if @link.valid_get?
      @link.verified_date = Time.new()
      http_check_msg = 'and the url was verified as valid'
    else
      http_check_msg = 'however it was *not* possible to visit the url as given currently'
    end
    respond_to do |format|
      if @link.save
        flash[:notice] = 'Link was successfully created, ' + http_check_msg
        format.html { redirect_to(@link) }
      else
        flash[:notice] = 'Error, The link was not created.'
        @groups = Group.all.collect { |g| [g.group_name, g.id] }
        format.html { render :action => "new"}
      end
    end
  end

我有通过上述控制器 verify_link 方法更新该字段的 javascript,但常规表单和随附的更新方法似乎没有更新更新方法中的属性 -

  def update
    @link = Link.find(params[:id])

    respond_to do |format|
      if @link.update_attributes(params[:link])
        @link.verify_url
        @link.save
        flash[:notice] = 'Link was successfully updated.'
        format.html { redirect_to(@link.group) }
      else
        @groups = Group.all.collect { |g| [g.group_name, g.id] }
        format.html { render :action => "edit" }
      end 
    end 
  end 

【问题讨论】:

  • 更新操作运行时您的日志是什么样的?

标签: ruby-on-rails ruby ruby-on-rails-3 rspec


【解决方案1】:

将您的方法更改为:

  def verify_url
    if valid_get?
      self.verified_date = Time.now
    end 
  end

注意self.。如果没有 self,您将创建一个新的局部变量,而不是更改模型属性。

【讨论】:

  • 伟大的收获!这是一个常见的错误,我犯了太多次我想承认:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2019-02-13
  • 2018-06-15
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多