2017-07-10 9 views
0

私のアプリにRequestモデルがあります。別のページでは、私は別のバリデーションが必要です。例えば、/contacts多くのフィールドを検証する必要がありますが、後でコールバックでは電話番号と名前だけを検証する必要があります。Rails単一テーブル継承の検証

私の問題は:データは保存されますが、検証なしでtypeも保存されません。

構造: request.rb

class Request < ApplicationRecord 

    self.inheritance_column = :_type_disabled 

    def self.types 
     %w(ContactRequest CallMeBackRequest) 
    end 

    scope :contacts, -> { where(type: 'ContactRequest') } 
    scope :callmebacks, -> { where(type: 'CallMeBackRequest') } 
end 

routes.rbを:

resources :contact_requests, only: [:new, :create], controller: 'requests', type: 'ContactRequest' 
resources :call_me_back_requests, only: [:new, :create], controller: 'requests', type: 'CallMeBackRequest' 

contact_request.rb:

class ContactRequest < Request 
    validates :name, :phone, :email, :company_name, presence: true 

    def self.sti_name 
    "ContactRequest" 
    end 
end 

call_me_back_request.rb:

class CallMeBackRequest < Request 
    validates :name, :phone, presence: true 

    def self.sti_name 
    "CallMeBack" 
    end 
end 

requests_controller.rb:

class Front::RequestsController < FrontController 
    before_action :set_type 

    def create 
    @request = Request.new(request_params) 

    respond_to do |format| 
     if @request.save 
     format.js 
     else 
     format.js { render partial: 'fail' } 

     end 
    end 
    end 

    private 

    def set_request 
    @request = type_class.find(params[:id]) 
    end 

    def set_type 
    @type = type 
    end 

    def type 
     Request.types.include?(params[:type]) ? params[:type] : "Request" 
    end 

    def type_class 
     type.constantize 
    end 

    def request_params 
    params.require(type.underscore.to_sym).permit(Request.attribute_names.map(&:to_sym)) 
    end 
end 

私のフォームで始まる:

=form_for Request.contacts.new, format: 'js', html: {class: 'g-contact__sidebar-right g-form'}, remote: true do |f| 

私はContactRequest.newを使用してみました - 結果は同じでした。 (なぜ?)何の検証が適用されない、救われない -

  • Request.contacts.create!(name: "something"):私はコンソールを打ったときに何を得る

    。いいえtypeフィールドが入力されています - なぜですか?

  • ContactRequest.create!(name: "something")は - 保存され、検証が
  • ContactRequest.create!(name: ..., all other required fields)を適用されません - 救われないが、フィールドtypeは空です - なぜ?

ものは何でも、私は自分のフォームに使う - ContactRequest.newまたはRequest.contacts.new - どちらの検証が適用されず、フィールドtypeが正しく設定されています。

誰でも正しい方向に向けることができますか?私は主にthis tutorialと他のSOの質問を使用していますが、成功なし。

答えて

0

私はこれらの連絡先に専用のページとパスを使用していないため、とそれに対応するnew.html.hamlがあるため、typeパラメータを非表示フィールドとして渡す必要があります。

だから私のフォームは次のようになります。

=form_for ContactRequest.new, format: 'js', html: {class: 'g-contact__sidebar-right g-form'}, remote: true do |f| 
    =f.hidden_field :type, value: "ContactRequest" 

は、検証を考慮すると - 私は私が何をしたか知らないが、サーバーを数回再起動した後、彼らが動作するようになりました。私が本当に変わったことを覚えている唯一のものは、ここにstiという名前でした:

class CallMeBackRequest < Request 
    validates :name, :phone, presence: true 

    def self.sti_name 
    "CallMeBack" <- changed it from "CallMeBack" to "CallMeBackRequest" 
    end 
end 
関連する問題