【问题标题】:validation for models in ruby on rails在 ruby​​ on rails 中验证模型
【发布时间】:2012-09-21 11:18:07
【问题描述】:

我有一个模型:

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

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

我不想接受 nil 作为文件名。我该怎么做?

【问题讨论】:

  • 它没有验证,因为您正在直接执行 sql (ActiveRecord::Base.connection.execute(sql))。验证仅在您使用 normal ActiveRecord 方法(如 saveupdate_attributes)时运行。你的存储过程是什么样的?真的有必要吗?如果没有,请尝试使用 ActiveRecord,就像它应该被使用一样。
  • 是的,谢谢。直接调用sql时是否可以验证字段?
  • 看我的回答。没试过,但类似的东西应该可以。

标签: ruby-on-rails rails-models


【解决方案1】:

因为你是直接执行sql所以没有验证:

ActiveRecord::Base.connection.execute(sql)

只有在您使用“普通”ActiveRecord 方法(如 saveupdate_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

【讨论】:

  • 是的...... bcz你给了我这样做的想法......现在我完成了它的工作。错误是我的。在我的控制器中没有任何更新方法之前。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多