17

रेल में एसोसिएशन के साथ मुझे (घंटों) परेशानी हो रही है। मैं इसी तरह की समस्याओं का एक बहुत कुछ पाया है, लेकिन मैं अपने मामले के लिए आवेदन नहीं कर सकता:सत्यापन विफल हुआ कक्षा

शहर के वर्ग:

class City < ApplicationRecord 
    has_many :users 
end 

उपयोगकर्ता की कक्षा:

class User < ApplicationRecord 
    belongs_to :city 

    validates :name, presence: true, length: { maximum: 80 } 
    validates :city_id, presence: true 
end 

उपयोगकर्ता नियंत्रक:

def create 
    Rails.logger.debug user_params.inspect 
    @user = User.new(user_params) 
    if @user.save! 
     flash[:success] = "Works!" 
     redirect_to '/index' 
    else 
     render 'new' 
    end 
end 

def user_params 
    params.require(:user).permit(:name, :citys_id) 
end 

उपयोगकर्ता देखें:

<%= form_for(:user, url: '/user/new') do |f| %> 
    <%= render 'shared/error_messages' %> 

    <%= f.label :name %> 
    <%= f.text_field :name %> 

    <%= f.label :citys_id, "City" %> 
    <select name="city"> 
    <% @city.all.each do |t| %> 
     <option value="<%= t.id %>"><%= t.city %></option> 
    <% end %> 
    </select> 
end 

माइग्रेट:

class CreateUser < ActiveRecord::Migration[5.0] 
    def change 
    create_table :user do |t| 
     t.string :name, limit: 80, null: false 
     t.belongs_to :citys, null: false 
     t.timestamps 
    end 
end 

कंसोल और ब्राउज़र से संदेश:

ActiveRecord::RecordInvalid (Validation failed: City must exist): 

ठीक है, समस्या है, उपयोगकर्ता की मॉडल से विशेषताओं FK नहीं हैं वे User.save विधि द्वारा स्वीकार कर रहे हैं , और fk विशेषताएँ जैसे शहर_आईडी नहीं हैं। फिर यह मुझे ब्राउजर में त्रुटि संदेश देता है कि "सत्यापन विफल शहर मौजूद होना चाहिए"। new docs के अनुसार

belongs_to :city, optional: true 

:

धन्यवाद

+0

संभावित डुप्लिकेट [नलबल विदेशी कुंजी जोड़ें] (http://stackoverflow.com/questions/27589399/add-nullable-foreign-key) –

उत्तर

35

निम्नलिखित का प्रयास करें

4.1.2.11: वैकल्पिक

आप सेट करते हैं: सच करने के लिए वैकल्पिक विकल्प, तो संबंधित ऑब्जेक्ट की उपस्थिति को सत्यापित नहीं किया जाएगा। डिफ़ॉल्ट रूप से, यह विकल्प पर गलत है।

+0

अरे इगोर .. यहां एक बीआर देखना अच्छा लगता है :) धन्यवाद आपका उत्तर। इसने काम कर दिया! मुझे पहले यह जवाब मिला, लेकिन मैंने अभी तक कोशिश नहीं की थी। कारण यह था कि ऐसा लगता है कि यह ** विकल्प ** सर्वर स्तर में attributer की सत्यापन को अमान्य कर देता है। इसलिए मैंने यह सुनिश्चित करने के लिए जांच की, जब मैं विदेशी कुंजी शहर_आईडी के लिए गलत मान देता हूं तो त्रुटि संदेश केवल डीबी ने सम्मिलन क्वेरी करने का प्रयास करने के बाद दिखाया, यह मुझे एक डीबी स्तर सत्यापन मानता है। वैसे भी, मैं इसे हल करने के लिए सर्वर स्तर पर अपनी खुद की सत्यापन कर दूंगा। मैं आपको एक यूपीवीओटी देना चाहता हूं, लेकिन मेरे पास पर्याप्त स्कोर नहीं है :(हाहा –

+0

ओह, मुझे यह नहीं पता था! हाहाहा अच्छा :) –

+2

अरघ यह काफी परेशान हो गया है। 'फैक्टरीगर्ल' में, यदि आप उस स्निपेट के बिना 'उपयोगकर्ता' के लिए केवल 'belong'to' वर्ग में फ़ैक्टरी बनाते हैं, तो आपको वह त्रुटि मिल जाएगी। अच्छी पकड़! –

1

मैं समस्या का समाधान पता चला "सत्यापन विफल: कक्षा मौजूद होना चाहिए" और यह उपयोग की तुलना में बेहतर है:

belongs_to :city, optional: true 

4.1.2.11: वैकल्पिक

आप सेट करते हैं : वैकल्पिक विकल्प सही है, तो संबंधित ऑब्जेक्ट की उपस्थिति को सत्यापित नहीं किया जाएगा। डिफ़ॉल्ट रूप से, यह विकल्प गलत पर सेट है।

क्योंकि आप अभी भी आवेदन स्तर में सत्यापन करते हैं। मैं अपने ही मान्यता बनाने विधि बनाने में और user_params विधि बदलते समस्या का समाधान:

def create 

    @city = City.find(params[:city_id]) 

    Rails.logger.debug user_params.inspect 
    @user = User.new(user_params) 

    @user.city_id = @city.id 

    if @user.save! 
    flash[:success] = "Works!" 
    redirect_to '/index' 
    else 
    render 'new' 
    end 
end 

def user_params 
    params.require(:user).permit(:name) 
end 

मैं इस कोड का परीक्षण नहीं किया है, लेकिन यह एक अन्य परियोजना खान में काम करता है। मुझे उम्मीद है कि यह दूसरों की मदद कर सकता है!

0
belongs_to :city, required: false 
+2

कृपया प्रश्न का उत्तर देने के लिए स्पष्टीकरण देने का प्रयास करें और न केवल कोड पोस्ट करें। धन्यवाद। – loki

3

यह थोड़ी देर हो चुकी आता है लेकिन यह कैसे रेल 5 में डिफ़ॉल्ट रूप से इस बात का चालू करने के लिए है:

config/initializers/new_framework_defaults.rb

Rails.application.config.active_record.belongs_to_required_by_default = false 

मुझे आशा है कि इससे मदद मिलती है!

2

आप belongs_to संबंध बयान के अंत में निम्नलिखित जोड़ने की जरूरत:

optional: true 

यह इतना है कि यह रेल के पुराने संस्करणों के रूप में एक ही तरीके से काम करता वैश्विक स्तर पर इस सेट करने के लिए संभव है, लेकिन मैं उन रिश्तों को मैन्युअल रूप से जोड़ने के लिए समय निकालने की सलाह दूंगा जो वास्तव में इसकी आवश्यकता है क्योंकि इससे भविष्य में कम दर्द होगा।

संबंधित मुद्दे