验证轨道上的红宝石模型

时间:2012-09-21 11:18:08

标签: ruby-on-rails rails-models

我有一个模特:

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的{​​{1}}。当我单击提交按钮时,它在模型中调用此更新方法以调用存储的proc来执行。现在验证不起作用。

我不想接受:filename的文件名。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

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

ActiveRecord::Base.connection.execute(sql)

只有在使用saveupdate_attributes等“普通”ActiveRecord方法时才会运行验证。要手动运行验证,您可以在对象上调用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