2016年7月29日 星期五

Cloud9-RoR-Authentication:devise validate custom fields and rails-i18n

參考文章:https://ihower.tw/rails4/i18n.html
詳細介紹-validate:http://guides.rubyonrails.org/active_record_validations.html
詳細介紹-自訂警語:http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models
參考來源:http://stackoverflow.com/questions/808547/fully-custom-validation-error-message-with-rails
參考文章:http://ricostacruz.com/cheatsheets/rails-i18n.html
下載 rails-i18n:https://github.com/svenfuchs/rails-i18n 

上一篇是介紹如何新增自訂欄位,這一篇就來教大家怎麼增加自訂欄位的驗證,雖然只有短短幾行,卻花費了我好多時間…總之,在打算放棄devise時,讓我找到了解答,還好最後還是守住了,神啊~讓我之後順利點吧!

打開app/models/user.rb檔,加入我們想要驗證的欄位名稱
  validates :cname, presence: true
  validates :phone1, numericality: true, length: { in: 9..12 }
  validates :zipcode, numericality: { only_integer: true }, length: { in: 3..5 }
  validates :address, presence: true

編輯Gemfile,加上
# 語系檔
gem "rails-i18n"

執行指令
$ gem install rails-i18n

在config/locales/下新增一個zh-TW.yml的檔案,用來指定各欄位顯示的文字,models用來指定rails/locale/底下的%{resource}名稱。
zh-TW:
  activerecord:
    models:
      user: "會員資料"
    attributes:
      user:
        cname: "姓名"
        email: "信箱"
        phone1: "電話1"
        zipcode: "郵遞區號"
        address: "地址"
        password: "密碼"
        password_confirmation: "確認密碼"

編輯config/application.rb
    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    config.i18n.load_path += Dir[Rails.root.join('rails', 'locale', '*.{rb,yml}').to_s]
    config.i18n.default_locale = "zh-TW"

    #devise_error
    config.action_view.field_error_proc = Proc.new { |html_tag, instance| 
      "<font style=\"color: #CC0000;\">#{html_tag}</font>".html_safe
    }

因為我發現 install 後檔案還是沒出現,可能要自行放上吧,如果你也是,就把下載 rails-i18n的檔案放到專案中,不過…我並沒有全放就是了,我放上的檔案如下:
  • bin/i18n-tasks, rspec
  • config/i18n-tasks.yml
  • lib (all)
  • rails (all)
  • space (all)
  • rails-i18n.gemspec
  • locales.thor
編輯 rails/locale/zh-TW.yml,把%{model}的部份取代為%{resource},並加上下列程式碼(綠色部份)
  errors:
    format: "%{attribute} %{message}"
      messages:
        not_saved:
          one: 有 1 個錯誤發生使得「%{resource}」無法被儲存。
          other: 有 %{count} 個錯誤發生使得「%{resource}」無法被儲存。

執行程式,連結到註冊頁面,按下SIGN UP鈕就可以看到下圖的警告視窗。











欄位文字的部份則會變成粗體紅字。









希望大家也能順利完成,本篇就到此結束,終於…寫了好幾個星期…

2016年7月12日 星期二

Cloud9-RoR-Authentication:devise add fields

參考文章:http://jacopretorius.net/2014/03/adding-custom-fields-to-your-devise-user-model-in-rails-4.html

如果想要在devise套件裡增加欄位該怎麼做呢?create the migrationd可以看此篇有關users的部份,以下就直接跳到create controller的步驟嘍!

首先,先新增一個RegistrationsController
$ rails g controller registrations

打開registrations_controller.rb檔,編輯內容,注意class的地方不一樣,有做繼承devise的動作
#class RegistrationsController < ApplicationController
class RegistrationsController < Devise::RegistrationsController  
  private

  def sign_up_params
    params.require(:user).permit(:cname, :phone1, :phone2, :address, :zipcode, :email, :password, :password_confirmation)
  end

  def account_update_params
    params.require(:user).permit(:cname, :phone1, :phone2, :address, :zipcode, :email, :password, :password_confirmation, :current_password)
  end
end

修改config/routes.rb
  #devise_for :users
  devise_for :users, :controllers => { registrations: 'registrations' }

Done.