রেলগুলিতে, বৈধতা ত্রুটি ব্যতীত একটি .save () ব্যর্থ হওয়ার কারণ কীভাবে আমি তা জানতে পারি?


91

আমার একটি অ্যাক্টিভেকর্ড মডেল রয়েছে যা trueথেকে ফিরে আসছে valid?(এবং .erferences খালি রয়েছে) তবে ফিরে falseআসছে save()। যদি মডেল উদাহরণটি বৈধ হয়, তবে কীভাবে সংরক্ষণগুলি ব্যর্থ হওয়ার কারণ হচ্ছে তা আমি কীভাবে জানতে পারি?


7
কয়েক সপ্তাহ আগে আমার এই সমস্যা হয়েছিল। কিছু রিফ্যাক্টরিং পূর্বের সংরক্ষণের ফাংশনটি সমস্ত সময় মিথ্যা ফিরিয়ে রেখেছিল, যার ফলে সংরক্ষণ ব্যর্থ হয়।
জেফ প্যাকেট

4
@ জেফ - ধন্যবাদ, দেখা যাচ্ছে যে এখানে একটি ছিল: পূর্ববর্তী সংরক্ষণের পদ্ধতিটি মিথ্যা প্রত্যাবর্তন করছে। আপনি কিভাবে খুঁজে পেলেন? এটি কি কেবল কোড পরিদর্শন ছিল?
কেডিটি

এটি কোড পরিদর্শন ছিল এবং সংস্করণ নিয়ন্ত্রণের বিরুদ্ধে পৃথক্ ছিল।
জেফ প্যাকেট

উত্তর:


49

আপনার সমস্ত কলব্যাক পরীক্ষা করুন।

আমার এমন সমস্যা ছিল যেখানে আমার ছিল এবং "পরে_বালাইটি" পদ্ধতিটি যা আমি মডেলটিতে একগুচ্ছ পরিবর্তন করার পরে ব্যর্থ হয়েছিল। মডেলটি বৈধ ছিল তবে "আফটার_অলিয়েট" মিথ্যা প্রত্যাবর্তন করছে, তাই যদি আমি model.validএটি ব্যবহার করে সত্য বলি, তবে আমি যদি এটি সংরক্ষণ করি তবে এটি আমাকে বৈধতা ত্রুটি দিয়েছে (পরবর্তী_ফলিত কলব্যাক থেকে পেরিয়ে গেছে)। এটি অদ্ভূত ছিল.

অ্যাপ্লিকেশন ট্রেসটি দেখুন এবং আপনার দেখতে পারা উচিত কোডের রেখাটি কী ব্যতিক্রম বাড়িয়ে তুলছে।


4
জেফের মন্তব্য অনুসারে, সমস্যাটি পূর্বের_সভিত কলব্যাককে মিথ্যা বলে প্রত্যাবর্তন করেছিল।
কেডিটি

4
@ কেডিটি - আমার সমস্যাটি হ'ল তাই। আমি এটি সম্পর্কে ভেবে দেখিনি কারণ পূর্ববর্তী সংরক্ষণ কেবল একটি সম্পত্তি সেট করার জন্য ছিল, কিন্তু কারণ এটি এটি একটি মিথ্যা মানকে সেট করেছিল, এটি স্পষ্টতই প্রত্যাবর্তিত হয়েছিল এবং এটি সংরক্ষণটি নিঃশব্দে ব্যর্থ করে দিয়েছে। উজ্জ্বল দিকে, আমার কাছে এখন লাইন যুক্ত করে এই কোডটি ঠিক করার বিকল্প রয়েছে "Hey! That's MY fake leg!" # Believe it or not, this is important। আমি তা করতাম না। ;)
নাথান লং

4
একটি সত্য ফেরত মান নিশ্চিত করার একটি চমৎকার উপায়true.tap { do_something }
নাথন লং

বাহ, কী একটা অস্পষ্ট সমস্যা। কখনই অনুমান করতে পারত না যে কোনও কলব্যাক মিথ্যা ফিরিয়ে দেওয়া বন্ধ করা বন্ধ করে দিয়েছে। কেউ কি আমাকে এই বিষয়ে ডক্সে নির্দেশ করতে পারে? এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ!
অ্যান্ডি


116

ব্যাং সংস্করণটি save!(শেষে একটি বিস্মৃত চিহ্ন সহ) ব্যবহার করার চেষ্টা করুন এবং ফলাফল ত্রুটিটি পরীক্ষা করে দেখুন।


4
সংরক্ষণ! কেবল একটি রেকর্ডনটসভেড নিক্ষেপ করছে (যখন আমি ব্যতিক্রমের ম্যাসেজটি প্রিন্ট করি তখন আমি কেবল ব্যতিক্রম শ্রেণীর নাম পাই)। কোথাও কি আমার আরও বিস্তারিত সন্ধান করা উচিত?
কেডিটি

4
আপনি যদি রেলগুলি বিকাশ মোডে থাকেন তবে এটি স্ট্যাক ট্রেস সহ ত্রুটির সম্পূর্ণ বিবরণ মুদ্রণ করা উচিত। যে কোনও ক্লুটির জন্য সেখানে একবার দেখুন এবং এটি এখানে পোস্ট করুন।
অ্যান্ডি লিন্ডেমান

4
আমি কনসোল ব্যবহার করি, বস্তুটি লোড করি (উদাঃ, ও = অবজেক্ট.ফাইন্ড # আইডি), তারপরে o.save করুন! উত্তর মত বলে। এটি কেন সংরক্ষণ করছে না তা মুদ্রণ করে।
pduey

4
এফওয়াইআই, কলিং save!উত্থাপন করতে পারে ActiveRecord::RecordInvalid(যেহেতু এটি বৈধতা চালায়) বা ActiveRecord::RecordNotSavedতাই আপনি উদ্ধার করতে চান।
ডেনিস

4
+1 কারণ .saveবৈধতা যা বৈধতার কারণে নয় তা নির্ণয় করার মৌলিক প্রশ্নের ন্যূনতম অসন্তুষ্টিজনক উত্তর । "ন্যূনতম অসন্তুষ্ট" যোগ্যতা এই উত্তরটি নয়, জেলগুলিকে বোঝায়।
চক ব্যাটসন

112

যদি @user.save(উদাহরণস্বরূপ) ফিরে আসে false, তবে সমস্ত ত্রুটি পেতে কেবল এটি চালান:

@user.errors.full_messages

13
আমি যেমন প্রশ্নে উল্লেখ করেছি,। માન્ય? সত্য - অর্থাত্ কোনও বৈধতা ত্রুটি নেই। আমি এটি পরীক্ষা করে ফেলেছি। ত্রুটিগুলিও একটি খালি তালিকা ফিরিয়ে দিচ্ছে (আমি এটি প্রকাশের জন্য প্রশ্নটি আপডেট করেছি)
কেডিটি

3

হ্যাঁ, আমি আমার পূর্ববর্তী_ * কলব্যাকগুলিতে সত্য ফিরে আসছি তা নিশ্চিত করেই এই সমস্যাটি সমাধান করেছি তবে এটি কাজ শুরু করে :)


-1

আমার সমস্যাটি ছিল আমি মডেলটিতে বৈধতা যুক্ত করতে ভুলে গিয়েছিলাম।

class ContactGroup < ActiveRecord::Base
  validates_presence_of :name
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.