`

Rails之表单验证

 
阅读更多

创建一个新项目,设置mysql数据库

rails new demo -d mysql
cd demo
rake db:create

用脚手架工具创建表单及数据库

rails generate scaffold Person name:string secret:string country:string email:string description:text can_send_email:boolean graduation_year:integer body_temperature:float price:decimal birthday:date favorite_time:time
rake db:migrate
rails server -d

编辑app/model/person.rb代码如下,实现表单验证功能

class Person < ActiveRecord::Base
  attr_accessible :birthday, :body_temperature, :can_send_email, :country, :description, :email, :favorite_time, :graduation_year, :name, :price, :secret

  #表单内容必须填写
  validates_presence_of :name, :message => "姓名必须填写"
  validates_presence_of :graduation_year, :message => "毕业年份必须填写"
  validates_presence_of :description, :message => "写一点自我介绍吧"
  #表单信息长度设置
  validates_length_of :secret, :in => 6..12, :message => "密码长度必须是6~12之间"
  #表单内容格式验证
  validates_format_of :secret, :with => /[0-9]/, :message => "密码至少需要包含数字,大写字母及小写字母"
  validates_format_of :secret, :with => /[A-Z]/, :message => "密码至少需要包含数字,大写字母及小写字母"
  validates_format_of :secret, :with => /[a-z]/, :message => "密码至少需要包含数字,大写字母及小写字母"
  #表单范围验证
  validates_inclusion_of :country, :in => ['Canada', 'Mexico', 'UK', 'USA'], :message => "国家在'Canada','Mexico','UK','USA'中选择"
  #邮箱格式验证
  validates_presence_of :email, :if => :require_email_presence?
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :if => :require_email_presence?, :message => "邮箱格式不>正确"
  #数据唯一性保证
  validates_uniqueness_of :email, :case_sensitive => false, :message => "邮箱已被占用"
  #多个数据规则验证
  validates_numericality_of :graduation_year, :allow_nil => true, :greater_than => 1920, :less_than_or_equal_to => Time.now.year, :only_integer => true, :message => "毕业年份不正确"
  #日期范围验证
  validates_inclusion_of :birthday, :in => Date.civil(1900, 1, 1) .. Date.today, :message => "日期必须是1900年1月1日到今天之间"
  #自定义验证
  validate :description_length_words

  #条件验证
  def require_email_presence?
    self.can_send_email
  end

  #自定义验证
  def description_length_words
    # only do this validation if description is provided
    unless self.description.blank? then
      # simple way of calculating words: split the text on whitespace
      num_words = self.description.split.length
      if num_words < 5 then
        self.errors.add(:description, "介绍必须是5个英文词以上")
      elsif num_words > 50 then
        self.errors.add(:description, "介绍控制在50个词以下")
      end
    end
  end
end

可以通过访问http://127.0.0.1:3000/people检测效果,上面是在测试环境运行

#编辑 config/environments/production.rb 文件,配置如下
config.serve_static_assets = true
config.assets.compile = true

 执行rails server -e production运行在生产环境下,使用生产环境的数据库

 

接着添加文件上传功能,首先需要为数据表增加头像字段

rails generate migration add_photo_extension_to_person

class AddPhotoExtensionToPerson < ActiveRecord::Migration
  def change
    add_column :people, :extension, :string
  end
end

rake db:migrate RAILS_ENV="production"修改数据表

修改model如下

class Person < ActiveRecord::Base
  attr_accessible :birthday, :body_temperature, :can_send_email, :country, :description, :email, :favorite_time, :graduation_year, :name, :price, :secret, :photo

  after_save :store_photo

  def photo=(file_data)
    unless file_data.blank?
      @file_data = file_data
      self.extension = file_data.original_filename.split('.').last.downcase
    end
  end
  def has_photo?
    File.exists? photo_filename
  end
  PHOTO_STORE = File.join Rails.root, 'public', 'photo_store'
  def photo_filename
    File.join PHOTO_STORE, "#{id}.#{extension}"
  end
  def photo_path
    "/photo_store/#{id}.#{extension}"
  end

private
  # 数据库操作完毕后将文件存入文件系统
  def store_photo
    if @file_data
      # 创建文件夹 
      FileUtils.mkdir_p PHOTO_STORE
      # write out the image data to the file
      File.open(photo_filename, 'wb') do |f|
        f.write(@file_data.read)
      end
      # ??
      @file_data = nil
    end
  end
end

增加_form.html.erb文件添加如下内容

#修改
<%= form_for(@person, :html => { :multipart => true }) do |f| %>

#添加
  <div class="field">
    <%= f.label :photo %><br />
    <%= f.file_field :photo %>
  </div>

添加show.html.erb文件如下

<p>
  <b>Photo:</b>
  <% if @person.has_photo? %>
  <%= image_tag @person.photo_path %>
  <% else %>
  No photo.
  <% end %>
</p>
分享到:
评论

相关推荐

    judge:Rails的客户端表单验证

    通过将许多ActiveModel::Validation功能移植到JavaScript,Judge可以轻松地对Rails进行客户端表单验证。 最常见的验证通过存储在HTML5数据属性中的JSON字符串进行,并且仅在客户端执行。 无论您在何处,Judge都为...

    Ruby-SimpleForm轻松处理Rails表单

    在Ruby on Rails框架中,构建表单是一项常见的任务,而Simple Form gem就是为了简化这一过程而设计的。Simple Form是一款强大的表单构建器,它提供了一种简洁、直观的方式来创建复杂的表单,使得开发者能更专注于...

    mail_form, 在 Rails 中使用 i18n 验证附件和请求信息,直接从表单发送电子邮件.zip

    mail_form, 在 Rails 中使用 i18n 验证附件和请求信息,直接从表单发送电子邮件 MailForm Rails 3这个 gem 构建在 ActiveModel 之上,展示如何从 Rails 中提取验证。命名和 i18n,而不需要自己实现。本自述文件指的...

    Ruby-MailForm直接从Rails的表单发送电子邮件支持I18n验证附件和请求信息

    除了基本的表单验证,MailForm还允许你方便地添加附件。只需在模型中定义一个`attachments`方法,然后传递文件名或者上传的文件对象即可: ```ruby class AttachmentForm attribute :file, :attachment def ...

    强大的表单验证,很不错的哦!

    在网页开发中,表单验证是一项至关重要的任务,它确保用户输入的数据符合预期的格式和标准,从而提高数据质量和用户体验。"强大的表单验证"这一主题涵盖了多种技术和策略,用于确保用户在提交表单时提供的信息是准确...

    rails2-sample

    同时,表单是Web应用中不可或缺的部分,Rails提供了丰富的API来处理表单的创建和验证。此外,布局(Layouts)允许开发者在多个页面中重用公共的HTML代码,如头部和尾部,从而提高开发效率。 #### 7. Ajax and Web ...

    Rails项目源代码

    Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...

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

    重要的该库不应用于验证大量参数或通过表单或命名空间发送的参数(例如params[:user][:first_name] )。 Rails(ActiveModel :: Model)中已经包含了一个不错的框架,该框架可用于创建虚拟类,其中包含您已经从Rails...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **学习路径**:继续深入学习Rails的高级特性,如Active Record模式、表单构建器等。 - **社区资源**:加入Rails官方论坛、Stack Overflow等社区获取帮助和支持。 #### 十一、文档编写技巧 - **重要性**:良好的...

    Ruby on Rails 指南 v5.0.1 中文版

    - **前提条件**:为了能够顺利地开始Rails的学习之旅,读者需要具备一定的Ruby语言基础,并且对Web开发有一定的了解。 - **Rails是什么?**:Rails是一种用于开发服务器端应用程序的模型-视图-控制器(MVC)框架,它...

    rails-1.0.0

    7. **辅助方法**:Rails提供了许多辅助方法,如link_to、form_for等,帮助开发者快速构建链接和表单,减少了代码量。 8. **脚手架**:Rails的scaffold命令可以自动生成基本的CRUD(创建、读取、更新、删除)功能,...

    swift-SwiftCop表单验证工具思路源自ROR的ActiveRecord

    SwiftCop 是一个灵感来源于 Ruby on Rails (ROR) 中的 Active Record 的表单验证工具,专为 Swift 开发者设计。在 ROR 中,Active Record 提供了一种强大的方式来处理模型的数据验证,使得开发者可以方便地定义和...

    Ruby on Rails实践

    Rails还提供了丰富的插件和gem库,如Devise用于身份验证,CanCanCan处理权限控制,Pundit管理授权,Bootstrap-Sass和jQuery-rails用于前端界面和交互。开发者可以方便地通过Gemfile引入这些工具,然后利用Bundler...

    RailsSpace

    这包括前端表单的设计与后端逻辑处理,如验证用户输入的有效性、密码加密存储等关键步骤。此外,还会涉及到如何利用Rails的内置工具来简化这些任务。 ##### 2.4 单元测试入门 第五章“Getting started with ...

    Rails入门教程一(翻译).pdf

    此外,教程还会涉及表单(Forms)和验证(Validations),讲解如何在视图中创建表单以及如何设置模型验证规则以确保数据的完整性。 至于视图,会讲解ERB(Embedded Ruby)模板语法,如何在HTML中嵌入Ruby代码,以及...

    ruby on rails 101

    ”这句话生动地描述了Ruby on Rails的独特之处以及它在Web开发领域的影响力。 #### 二、安装 安装Ruby on Rails的方法多样,具体包括: - **InstantRails**:适用于Windows用户的单击安装包。 - **Locomotive**:...

    rails中使用javascript日期控件

    2. **数据验证**:Rails的模型验证(如`validates :date_field_name, presence: true, date: true`)可以与JavaScript验证配合,以在客户端和服务器端都确保日期的有效性。 3. **AJAX更新**:如果应用使用了AJAX来...

    InspiniaAdmin 2.6.1 Rails_Full_Version

    3. **表单元素**:提供多种表单控件,如输入框、下拉框、日期选择器等,以及表单验证机制,使得用户输入更加规范。 4. **多语言支持**:InspiniaAdmin支持多语言,方便构建跨国或跨地区的项目,适应全球化需求。 5...

    Agile+Web+Development+with+Rails中文版.pdf

    书中还会介绍Rails的安全实践,如防止跨站脚本攻击(XSS)、跨站请求伪造(CSRF)以及数据验证,帮助开发者构建安全的应用程序。同时,也会讨论部署和运维相关的知识,包括环境配置、数据库迁移、性能优化和故障排查...

    Ajax 表单验证 实现代码

    通过以上的知识点,我们可以了解到实现Ajax表单验证需要前端和后端的协作,涉及到HTML、JavaScript、XMLHttpRequest对象、以及后端语言(如Ruby)和框架(如Rails)的应用。同时,兼容性、安全性和用户体验都是在...

Global site tag (gtag.js) - Google Analytics