রেলস: has_one সমিতি তৈরি করুন


100

হাই (এখানে বিশাল রেল নবাবী), আমার কাছে নিম্নলিখিত মডেলগুলি রয়েছে:

class Shop < ActiveRecord::Base
  belongs_to :user
  validates_uniqueness_of :title, :user_id, :message => "is already being used"
end

এবং

class User < ActiveRecord::Base
  has_one :shop, :dependent => :destroy
end

যখন আমি একটি নতুন দোকান তৈরি করতে চলেছি, আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

private method `create' called for nil:NilClass

এটি আমার নিয়ামক:

@user = current_user
@shop = @user.shop.create(params[:shop])

আমি এখানে এবং সেখানে গাইড এবং টিউটোরিয়াল পড়ে বিভিন্ন ভিন্নতার চেষ্টা করেছি, তবে আমি আগের তুলনায় আরও বিভ্রান্ত হয়েছি এবং এটি কাজ করতে পারি না। কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে।



4
আপনি এটিও ব্যবহার করতে পারেন@user.build_shop(params)
ইমরাননকভি

উত্তর:


122

প্রথমত, আপনি যা চান তা এখানে করবেন:

@user = current_user
@shop = Shop.create(params[:shop])
@user.shop = @shop

আপনার সংস্করণটি কেন কাজ করে নি তা এখন এখানে:

আপনি সম্ভবত ভেবেছিলেন এটি কাজ করতে পারে কারণ যদি ব্যবহারকারীর has_manyশপের সাথে সম্পর্ক থাকে @user.shops.create(params[:shop]) তবে কাজ করবে। তবে has_manyসম্পর্ক এবং has_oneসম্পর্কের মধ্যে একটি বড় পার্থক্য রয়েছে :

একটি has_manyসম্পর্কের সাথে, shopsএকটি অ্যাক্টিভেকর্ড সংগ্রহের অবজেক্ট ফিরিয়ে দেয়, এমন কোনও পদ্ধতি রয়েছে যা আপনি ব্যবহারকারীর কাছে / শপ যুক্ত করতে এবং মুছে ফেলার জন্য ব্যবহার করতে পারেন। এই পদ্ধতিগুলির মধ্যে createএকটি হ'ল যা একটি নতুন দোকান তৈরি করে এবং এটি ব্যবহারকারীকে যুক্ত করে।

কোনও has_oneসম্পর্কের সাথে, আপনি এই জাতীয় সংগ্রহের বস্তুটি ফিরে পাবেন না, তবে কেবলমাত্র শপ অবজেক্ট যা ব্যবহারকারীর অন্তর্গত - বা ব্যবহারকারীর কাছে এখনও দোকান না থাকলে শূন্য করুন। যেহেতু শপ অবজেক্ট বা নীল উভয়ের কোনও createপদ্ধতি নেই, আপনি সম্পর্কের createসাথে এইভাবে ব্যবহার করতে পারবেন না has_one


আপনার উত্তরের জন্য ধন্যবাদ, sepp2k। আমি এখন দেখছি কেন আমার কোড কাজ করতে পারে না।
নেকো

120
আপনি ব্যবহার করতে পারে @user.create_shop(params[:shop])Has_one দ্বারা যুক্ত পদ্ধতিগুলি দেখুন ।
21

উত্তরটি বেছে নিয়েছে, তবে @ সমাধানগুলিও কাজ করে। আপনার দুজনের কাছেই +1।
nender21

উত্তরের উত্তরটি +1 কারণ আমি একই ভাবছিলাম, কেন এটি হচ্ছে তা ব্যাখ্যা করার জন্য উত্তরটির +1 এবং সর্বোত্তম সমাধান দেওয়ার জন্য মন্তব্যে +1 করুন।
স্পষ্টত

227

এটি করার আরও একটি সংক্ষিপ্ত উপায় হ'ল:

@user.create_shop(params[:shop])

রেল অন রেল গাইডগুলিতে has_one দ্বারা যুক্ত পদ্ধতিগুলি দেখুন ।


6
এটি অবশ্যই আরও ভাল পদ্ধতির
ম্যাগনাম

7
সাবধানতা অবলম্বন করুন যে আপনি যদি একাধিকবার শপ তৈরি করেন তবে এটি আগের দোকানটি মুছে ফেলবে। উদাহরণস্বরূপ, আপনি @user.create_shop(params[:shop_one_info])এটি চালনা করলে শপ-অণ তৈরি হবে, তবে আপনি চালনা @user.create_shop(params[:shop_two_info])করলে এটি প্রথম দোকানটি মুছবে এবং দ্বিতীয়টি তৈরি করবে।
ইকোডিং

পূর্ববর্তী দোকানটি মোছার বিষয়ে উপরের মন্তব্যটি ails.২.১৮ রেলের জন্য, আরও সাম্প্রতিক সংস্করণ সম্পর্কে জানেন না। 5 মিনিট -_- এর পরে মন্তব্য সম্পাদনা করতে পারবেন না
ইকোডিং

একটি সমাধান খুঁজে পেয়েছি, আমি সম্পর্কিত মডেলটিতে স্বতন্ত্রতা সেট করিনি, সুতরাং এটি নিশ্চিত করুন যে এটি কীভাবে এই উদাহরণের শপ মডেলটিতে সেট আপ হয়।
ইকোডিং

আপনি @user.build_shop(params)
অন্যভাবে


1

কেবল উপরের উত্তরগুলিতে যুক্ত করতে -

@user.create_shop(params[:shop])

উপরে সিনট্যাক্স নতুন রেকর্ড তৈরি করে তবে এটি পরবর্তীকালে অনুরূপ বিদ্যমান রেকর্ডটি মুছে দেয়।

বিকল্পভাবে, আপনি কলব্যাক মুছতে ট্রিগার করতে না চাইলে

Shop.create(user_id: user.id, title: 'Some unique title')

এই থ্রেড সহায়ক হতে পারে। এখানে ক্লিক করুন

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