2016-08-27 4 views
0

コントローラの作成および更新メソッドが期待どおりに機能していません。私の属性の1つはクーポンコードです。私は、クーポンコードになりたい:レールのRegex検証が機能しません:空白値を持つ一意の英数字の値が許可されます

  • ユニークしかし、空白またはnilの大文字、数字にコードを制限する
  • 使用正規表現を値と現在

を強調できるように、私はいくつかを持っています問題。私のモデルはClassPriceと呼ばれ、2つの属性を持っています::coupon_code &:cost_in_cents。問題は、次のとおりです。

  • 私は空白を使用して新しいClassPriceを作成しようとすると:COUPON_CODEは、それは、新しいアクションをリロードする私が成功したメッセージを与えるが、新しいコードは実際には保存されません。
  • 既存のClassPriceを空白:coupon_codeで更新しようとすると、検証エラーが表示され、変更は保存されません。「エラー:文字、数字またはアンダースコアが大文字でしかない」ここで

私のコントローラである:

class ClassPrice < ActiveRecord::Base 
    has_many :class_section_prices 
    has_many :class_sections, through: :class_section_prices 
    after_initialize :init 

    validates :coupon_code, uniqueness: true, allow_blank: true, allow_nil: true 

    validates :coupon_code, format: { with: /\A[A-Z0-9_]+\z/, 
    message: "ERROR: only allows upppercase letters, numbers or underscores." } 

    def cost_in_dollars 
    if self.amount_in_cents == 0 
     "FREE" 
    else 
     "$#{amount_in_cents/100.0}0" 
    end 
    end 

    def virtual_price_in_dollars 
    amount_in_cents.to_d/100 if amount_in_cents 
    end 

    def virtual_price_in_dollars=(dollars) 
    self.amount_in_cents = dollars.to_d * 100 if dollars.present? 
    end 

    private 

    def init 
    self.coupon_code  ||= "" 
    self.amount_in_cents ||= 0 
    end 
end 

そして、ここでは私のモデルである:

class Admin::ClassPricesController < ApplicationController 
    layout 'admin' 
    before_action :full_authenticate 

    def full_authenticate 
    authenticate_user! 
    if !current_user.is_admin? 
     flash[:alert] = "Access denied." 
     redirect_to root_url 
    end 
    end 

    def index 
    @class_prices = ClassPrice.all 
    end 


    def new 
    @class_price = ClassPrice.new 
    end 

    def create 
    if @class_price = ClassPrice.create(class_price_params) 
     redirect_to new_admin_class_price_path(@class_price), notice: 'New class price created.' 
    else 
     render action: "new" 
    end 
    end 

    def edit 
    @class_price = ClassPrice.find(params[:id]) 
    end 

    def update 
    @class_price = ClassPrice.find(params[:id]) 
    if @class_price.update_attributes(class_price_params) 
     redirect_to edit_admin_class_price_path(@class_price), notice: 'Class Price was successfully updated.' 
    else 
     render action: "edit" 
    end 
    end 

    def destroy 
    @class_price = ClassPrice.find(params[:id]) 
    if @class_price != nil 
     @class_price.destroy 
     redirect_to admin_class_prices_path(@class_section), notice: 'Class Price was deleted.' 
    else 
     redirect_to admin_class_prices_path(@class_section), notice: 'Class Price not found.' 
    end 
    end 

    private 

    def class_price_params 
    params.require(:class_price).permit(:class_price_id, :amount_in_cents, :coupon_code, :virtual_price_in_dollars) 
    end 
end 

問題がある任意のアイデア?

答えて

1

あり、私はあなたのコード内で参照の問題のカップル:あなたはallow_blank

  • 必要がある場合にもallow_nilを使用する必要はありませんので

    1. allow_blank: trueは、値がnilまたは空の文字列にすることができますフォーマットの検証でallow_blankが見つかりません。
    2. after_initializeコールバックを削除します。 ClassPriceオブジェクトをインスタンス化するたびに起動します。また、データベースから正しいレコードをフェッチすると、空白のcoupon_codeとamount_in_centsが0に設定されます
    3. 作成アクションが正しくありません。 ClassPrice.createは、データベースに保存されているかどうかに関係なく、常にオブジェクトを返します。そしてこのオブジェクトは常に真と評価されます。これを2行に分割し、最初にオブジェクトを作成して保存する必要があります。私は私が何かを逃さなかった願ってい

      def create 
          @class_price = ClassPrice.new(class_price_params) 
          if @class_price.save 
          redirect_to new_admin_class_price_path(@class_price), notice: 'New class price created.' 
          else 
          render action: "new" 
          end 
      end 
      

    だからあなたの検証は、この

    validates :coupon_code, uniqueness: { allow_blank: true }, 
        format: { with: /\A[A-Z0-9_]+\z/, message: "ERROR: only allows upppercase letters, numbers or underscores.", allow_blank: true } 
    

    ように見えるそして、あなたのcreateアクションする必要があります。

  • 関連する問題