`
muyu
  • 浏览: 218592 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Rails的model验证

阅读更多

 

写道
这是项目开发中的记录的,关于model的验证

 

在model层里加入关于validates_presence_of、validates_numericality_of等验证,当客户端构造的对象通不过验证时,错误信息要反映到表单的放置error_messages的地方。

 

有以下几点要注意:

 

传递的实例变量

这里,要注意错误信息的传递,即如何从model层传递到view层。用实例变量(比如”@pet”),而不是pet,pet是传不过来的。

 

在view层,有

<% form_for :pet, @pet, :url => { :action => 'add' } do |f| %>

<%= f.error_messages %>(这一行也可以写作<%= error_messages_for :pet %>)

在controller层,则要

@pet = Pet.new(params[:pet])

 

如果我们写作pet= Pet.new(params[:pet]),错误信息就无法在view层呈现。

 

跳转

如果在controller中加入了保存失败的跳转处理,当验证失败后,系统直接转向了else的代码区,而没能把当前的模型对象出错信息显示到view层。

 

      if @pet.save

        redirect_to_message '保存成功'

      #else

      #  redirect_to_message 'shibaila'

 

多个对象

在企业会员提交加盟申请时,表单里有两个对象:leagueapp 和 categories,前者是加盟信息,后者是经营类别。由于经营类别是从数据库动态加载的,所以,在数据验证失败后,leagueapp对象仍然有效,即@leagueapp仍然可以在view层显示。紧接着问题出现了,由于@categories只在页面提交时猜赋值的,而点击提交按钮后的request.post? 下的代码中,并没有@categories 的赋值情况,所以,view层无法显示最初正常显示的分类。

 

解决方法,当然很简单了,无论页面是否提交,每次均要加载@categories赋值的代码,确保页面提交失败时,view层可以正常显示分类那段代码。

 

也就是,把@categories = Category.find(:all) 放在 if request.post? … else … end 之外。

考虑到验证失败后,要保留用户刚才选中的分类,可以在提交的代码中记下选中的值,然后,在view层用js显示绑定 

 

多对多的验证

 

一个加盟商可以有多个分类,两个表:leagueapps 和 scopes ,还有一个多对多的关系表leagueapps_scopes ,要注意在这两个model同时设置

 has_and_belongs_to_many :leagueapps。

 

验证的语法,就和普通字段一样,在model / leagueapps.rb 下,用

  validates_presence_of :addr, :message => '详细地址必填', :on => :create

  validates_presence_of :scopes, :message => '经营项目至少选一个', :on => :create

 

尽管leagueapps表中没有scopes字段,ActiveRecord自动帮我们搞定啦。


 

1
0
分享到:
评论

相关推荐

    Ruby-ActiveModel的自定义验证用于检查数组是否包含在另一个中

    Active Model的自定义验证,用于检查数组是否包含在另一个中

    rails_param:Rails的参数验证和类型强制

    Rails(ActiveModel :: Model)中已经包含了一个不错的框架,该框架可用于创建虚拟类,其中包含您已经从Rails知道并喜欢的所有验证。 记住要始终尝试遵守“瘦控制器”规则。 请参见页面看到关于如何建立加载...

    无密码:Rail对Rails应用程序进行身份验证,而无需输入密码

    $ bin/rails generate model User email 然后使用以下命令指定User记录中的哪个字段是电子邮件字段: class User &lt; ApplicationRecord validates :email , presence : true , uniqueness : { case_sensitive :...

    api_guard:用于Rails API的JWT身份验证解决方案

    $ rails generate model user name:string email:string:uniq password_digest:string 然后,运行迁移以创建users表。 $ rails db:migrate 在User模型中添加以进行密码验证。 请参阅以配置API Guard身份验证以与...

    unique_validation_inspector:一项Rake任务,可帮助您在没有适当数据库索引的Rails模型中找到唯一的验证

    如果启用了唯一性验证,Rails将在执行Model.create , Model.save , Model.update ...操作之前查找现有记录。 如果找到记录,则验证失败,并且事务将回滚,否则记录将被保存。 例如,您具有facebook_id字段的用户...

    Rails扩展框架Trailblazer.zip

    Trailblazer 是基于 Rails 的一个瘦的封装层,加强了代码的封装使用,更直观的代码结构和面向对象架构。是一种概念驱动的架构模型,项目目录如下: app├── concepts│ ├── comment│ │ ├── cell.rb│ ...

    auth_boilerplate:使用 Rails 4 和 Bcrypt 进行样板认证

    #Rails 身份验证样板验证是乏味的。... 通过has_secure_password具有合理验证和 bcrypt 密码支持的用户模型##安装生成样板用户: $ rails g model User name username password_digest email根据需要复制和

    rails_zen:Ruby on Rails 中的事物的齐纳器

    这将从您那里获得唯一性和验证,并编写适当的文件(模型、迁移、model_spec)。 此处生成的规格假设您正在使用 Rspec (&gt;3.0) 应达匹配器 工厂女工 注意:您需要在 rails 目录的根目录下使用此应用程序 免责声明:...

    约束验证

    ActionView和约束验证API 除了构建更易于访问的表单和字段之外,Action View扩展还引入了一些新概念和模式,以改善开发人员在服务器生成HTML中呈现Active Model验证方面的体验。 还引入了互补的客户端模式,以与...

    green_light:对Rails进行简单的客户端验证,将验证保留在模型中

    green_light 在的帮助下提供客户端验证。 将验证保留在模型所属的模型中。 安装 将green_light添加到您的Gemfile中...= form_for(@model, :html =&gt; { :class =&gt; 'green_light' }) do |f| %&gt; 最后,向模型添加一些验

    ember-model-validator:ember-cli addon为您的Ember-Data模型添加了验证支持

    这个Ember插件诞生于对类似于Ruby on Rails上的模型提供验证支持的必要性。 安装 安装Ember-model-validator很容易,因为: npm install ember-model-validator --save-dev或yarn add ember-model-validator --dev ...

    validator_attachment:检查ActiveModel验证程序是否附加到模型的属性以及使用哪些选项

    假设已经由Rails测试过Rails验证,那么当我对Model的属性进行验证时,我只想测试验证是否存在。 而已。 用法 假设您具有如下模型: class MyAwesomeModel &lt; ActiveRecord xss=removed&gt; true end 在您的测试中: ...

    active_form_model

    ActiveForm模型 ...params)发电机使用提供的生成器生成表单: $ rails g active_form_model:form sign_up --model=user或使用命名空间模型 $ rails g active_form_model:form admin_post --model=blog/post

    Rails博客嵌套表格v-000

    例如, rails g model User username:string email:string --no-test-framework 。 但是,由于我们已提供了启动程序文件,因此本练习无需这样做。 标签 我们需要在PostsController更改允许的参数,以接受另一个属性...

    grape-api-generator:葡萄的Rails生成器脚本集合

    rails generate grape:install my_app --version 2 --model_name customer 脚手架新资源 搭建资源API,例如Post rails generate grape:scaffold my_app post 它将创建资源API,实体和规范/测试文件。 您还可以为...

    ddd-rails-sample:使用Ruby on Rails的示例域驱动设计项目

    注意:这不是最终的解决方案或生产准备项目涉及的技术/框架Ruby on Rails 活动记录干::类型干::验证建筑遵循SOLID和Clean Code原则的面向对象编程域驱动设计储存库模式CQRS(相同的数据库) 指令查询将来很高兴 ...

    tuttle:Rails运行时配置检查器

    塔特尔 Tuttle是一种工具,可以帮助Rails开发人员窥探幕后以检查其应用程序的运行时配置信息。 Tuttle可以帮助您对配置错误的应用程序进行故障排除,或者... Tuttle仍处于beta /概念验证模式,但可以安全地用于开发中,

    store_model:使用JSON支持的属性作为ActiveRecord式模型

    验证,枚举和嵌套属性的工作原理与Rails提供的API非常相似 :keycap_1: 遵循单一责任原则。 保持存储在与模型分离的JSON列中的数据周围的逻辑 :male_sign_selector: 生于生产中。 class Configuration include ...

    Rails重构API-V-000

    手动创建文件–使用rails g model将自动从Active Record继承并创建迁移。 建立GithubRepo类以通过模型测试。 将身份验证从控制器移动到服务对象。 为您的GithubService对象实现#initialize方法。 将其余的API...

    yaaf:在Rails应用程序中简化表单对象模式

    YAAF(又是另一个活动表单)是一个让您以简单且Rails友好的方式创建表单对象的宝石。...将业务逻辑验证置于模型之外 还有其他一些表单对象gem,但我们认为它们都不提供我们期望的所有功能: 行为类似于Rails模

Global site tag (gtag.js) - Google Analytics