写道
这是项目开发中的记录的,关于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自动帮我们搞定啦。
分享到:
相关推荐
Active Model的自定义验证,用于检查数组是否包含在另一个中
Rails(ActiveModel :: Model)中已经包含了一个不错的框架,该框架可用于创建虚拟类,其中包含您已经从Rails知道并喜欢的所有验证。 记住要始终尝试遵守“瘦控制器”规则。 请参见页面看到关于如何建立加载...
$ bin/rails generate model User email 然后使用以下命令指定User记录中的哪个字段是电子邮件字段: class User < ApplicationRecord validates :email , presence : true , uniqueness : { case_sensitive :...
$ rails generate model user name:string email:string:uniq password_digest:string 然后,运行迁移以创建users表。 $ rails db:migrate 在User模型中添加以进行密码验证。 请参阅以配置API Guard身份验证以与...
如果启用了唯一性验证,Rails将在执行Model.create , Model.save , Model.update ...操作之前查找现有记录。 如果找到记录,则验证失败,并且事务将回滚,否则记录将被保存。 例如,您具有facebook_id字段的用户...
Trailblazer 是基于 Rails 的一个瘦的封装层,加强了代码的封装使用,更直观的代码结构和面向对象架构。是一种概念驱动的架构模型,项目目录如下: app├── concepts│ ├── comment│ │ ├── cell.rb│ ...
#Rails 身份验证样板验证是乏味的。... 通过has_secure_password具有合理验证和 bcrypt 密码支持的用户模型##安装生成样板用户: $ rails g model User name username password_digest email根据需要复制和
这将从您那里获得唯一性和验证,并编写适当的文件(模型、迁移、model_spec)。 此处生成的规格假设您正在使用 Rspec (>3.0) 应达匹配器 工厂女工 注意:您需要在 rails 目录的根目录下使用此应用程序 免责声明:...
ActionView和约束验证API 除了构建更易于访问的表单和字段之外,Action View扩展还引入了一些新概念和模式,以改善开发人员在服务器生成HTML中呈现Active Model验证方面的体验。 还引入了互补的客户端模式,以与...
green_light 在的帮助下提供客户端验证。 将验证保留在模型所属的模型中。 安装 将green_light添加到您的Gemfile中...= form_for(@model, :html => { :class => 'green_light' }) do |f| %> 最后,向模型添加一些验
这个Ember插件诞生于对类似于Ruby on Rails上的模型提供验证支持的必要性。 安装 安装Ember-model-validator很容易,因为: npm install ember-model-validator --save-dev或yarn add ember-model-validator --dev ...
假设已经由Rails测试过Rails验证,那么当我对Model的属性进行验证时,我只想测试验证是否存在。 而已。 用法 假设您具有如下模型: class MyAwesomeModel < ActiveRecord xss=removed> true end 在您的测试中: ...
ActiveForm模型 ...params)发电机使用提供的生成器生成表单: $ rails g active_form_model:form sign_up --model=user或使用命名空间模型 $ rails g active_form_model:form admin_post --model=blog/post
例如, rails g model User username:string email:string --no-test-framework 。 但是,由于我们已提供了启动程序文件,因此本练习无需这样做。 标签 我们需要在PostsController更改允许的参数,以接受另一个属性...
rails generate grape:install my_app --version 2 --model_name customer 脚手架新资源 搭建资源API,例如Post rails generate grape:scaffold my_app post 它将创建资源API,实体和规范/测试文件。 您还可以为...
注意:这不是最终的解决方案或生产准备项目涉及的技术/框架Ruby on Rails 活动记录干::类型干::验证建筑遵循SOLID和Clean Code原则的面向对象编程域驱动设计储存库模式CQRS(相同的数据库) 指令查询将来很高兴 ...
塔特尔 Tuttle是一种工具,可以帮助Rails开发人员窥探幕后以检查其应用程序的运行时配置信息。 Tuttle可以帮助您对配置错误的应用程序进行故障排除,或者... Tuttle仍处于beta /概念验证模式,但可以安全地用于开发中,
验证,枚举和嵌套属性的工作原理与Rails提供的API非常相似 :keycap_1: 遵循单一责任原则。 保持存储在与模型分离的JSON列中的数据周围的逻辑 :male_sign_selector: 生于生产中。 class Configuration include ...
手动创建文件–使用rails g model将自动从Active Record继承并创建迁移。 建立GithubRepo类以通过模型测试。 将身份验证从控制器移动到服务对象。 为您的GithubService对象实现#initialize方法。 将其余的API...
YAAF(又是另一个活动表单)是一个让您以简单且Rails友好的方式创建表单对象的宝石。...将业务逻辑验证置于模型之外 还有其他一些表单对象gem,但我们认为它们都不提供我们期望的所有功能: 行为类似于Rails模