私のアプリに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の質問を使用していますが、成功なし。