1

我有一个模型:

class HelloRails < ActiveRecord::Base
  attr_accessible :filename, :filevalidate
  include In4systemsModelCommon

  validates :filename, presence: true

  def update
      parameters = [self.filename, @current_user]
      parameters.map!{|p| ActiveRecord::Base.connection.quote p}
      sql = "call stored_procedure(#{parameters.join(',')})"
      ActiveRecord::Base.connection.execute(sql)
  end
end

在视图中,我有一个text_field称为 as :filename。当我单击提交按钮时,它会在模型​​中调用此更新方法来调用存储的过程来执行。现在验证不起作用。

我不想接受nil文件名。我怎样才能做到这一点?

4

1 回答 1

1

它不验证,因为您正在直接执行 sql:

ActiveRecord::Base.connection.execute(sql)

仅当您使用“普通”ActiveRecord 方法(如save和)时才会运行验证update_attributes。要手动运行验证,您可以调用valid?您的对象。

模型:

def update
  return false unless self.valid? # validation failed: return false
  parameters = [self.filename, @current_user]
  parameters.map!{|p| ActiveRecord::Base.connection.quote p}
  sql = "call stored_procedure(#{parameters.join(',')})"
  ActiveRecord::Base.connection.execute(sql)
  true
end

然后在您的控制器中,您必须检查是否@object.update返回truefalse在必要时在视图中显示错误。

控制器:

# This is just an example. I don't know your code.
def update
  @object = HelloRails.find(params[:id])

  if @object.update
    redirect_to somewhere
  else
    render :action => 'edit'
  end
end
于 2012-09-21T11:41:07.053 回答