রেলগুলিতে এসটিআই সাবক্লাসের রুটগুলি পরিচালনা করার জন্য সেরা অনুশীলন


175

আমার পাগল মতামত এবং কন্ট্রোলার সঙ্গে littered হয় redirect_to, link_toএবং form_forপদ্ধতি কল। কখনও কখনও link_toএবং redirect_toতারা যে লিঙ্কগুলিতে লিখিত হয় সেগুলিতে স্পষ্ট হয় (উদাহরণস্বরূপ link_to 'New Person', new_person_path), তবে অনেক সময় পথগুলি অন্তর্ভুক্ত থাকে (যেমন link_to 'Show', person)।

আমি আমার মডেলটিতে কিছু একক টেবিলের উত্তরাধিকার (এসটিআই) যুক্ত করব (বলুন Employee < Person), এবং সাবক্লাসের (উদাহরণস্বরূপ Employee) উদাহরণের জন্য এই সমস্ত পদ্ধতি ভেঙে যায় ; যখন রেলগুলি কার্যকর করে link_to @person, এতে ত্রুটি ঘটে undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>। রেলগুলি বস্তুর শ্রেণীর নাম দ্বারা নির্ধারিত কোনও রুট সন্ধান করছে, যা কর্মচারী। এই কর্মচারী রুটগুলি সংজ্ঞায়িত করা হয়নি, এবং কোনও কর্মচারী নিয়ামক নেই যাতে ক্রিয়াগুলি সংজ্ঞায়িত হয় না।

এই প্রশ্ন আগে জিজ্ঞাসা করা হয়েছে:

  1. Stackoverflow , উত্তর আপনার সমগ্র কোডবেস মধ্যে LINK_TO ইত্যাদি প্রতিটি উদাহরণের সম্পাদনা, এবং স্পষ্টভাবে পথ রাষ্ট্র হয়
  2. উপর Stackoverflow আবার, দুই জনের ব্যবহার করার সুপারিশ routes.rbপিতা বা মাতা ক্লাসে উপশ্রেণী সম্পদগুলি (ম্যাপ map.resources :employees, :controller => 'people')। একই এসও প্রশ্নের শীর্ষের উত্তরটি কোডবেসে প্রতিটি উদাহরণ বস্তুকে টাইপ-কাস্টিং করার পরামর্শ দেয়.becomes
  3. স্ট্যাকওভারফ্লোতে আর একটি , শীর্ষ উত্তর হ'ল ডু রিপিটস ইয়োরস ক্যাম্পে এবং প্রতিটি সাবক্লাসের জন্য নকল স্ক্যাফোর্ডিং তৈরি করার পরামর্শ দেয়।
  4. এখানে আবার একই প্রশ্নটি এসও, যেখানে শীর্ষ উত্তরটি কেবল ভুল বলে মনে হচ্ছে (রেল ম্যাজিক জাস্ট ওয়ার্কস!)
  5. ওয়েবে অন্য কোথাও, আমি এই ব্লগ পোস্টটি পেয়েছি যেখানে F2Andy কোডের যে কোনও জায়গায় পাথ সম্পাদনা করার পরামর্শ দেয়।
  6. লজিকাল রিয়ালিটি ডিজাইনের ব্লগ পোস্টে একক টেবিল উত্তরাধিকার এবং আরএসএসএলফুল রুটগুলিতে , উপরের এসও উত্তর সংখ্যা 2 হিসাবে সাবক্লাসের সংস্থানগুলি সুপারক্লাস নিয়ামককে ম্যাপ করার পরামর্শ দেওয়া হচ্ছে।
  7. অ্যালেক্স রিসনার একটি পোস্ট হয়েছে পাগল মধ্যে একক ছক উত্তরাধিকার , যা তিনি পিতা বা মাতা ক্লাসে শিশু ক্লাস সম্পদ ম্যাপিং বিরুদ্ধেও সমর্থন routes.rb, যেহেতু যে শুধুমাত্র ক্যাচ থেকে breakages রাউটিং link_toএবং redirect_to, কিন্তু না থেকে form_for। সুতরাং তিনি পরিবর্তে সাবক্লাসগুলি তাদের ক্লাস সম্পর্কে মিথ্যা বলার জন্য অভিভাবক শ্রেণিতে একটি পদ্ধতি যুক্ত করার পরামর্শ দেন। ভাল লাগছে, তবে তার পদ্ধতিটি আমাকে ত্রুটি দিয়েছে undefined local variable or method `child' for #

এর জবাব হলো, সবচেয়ে মার্জিত মনে হয় এবং সবচেয়ে ঐক্যমত্য আছে (কিন্তু এটা সব না তাই যে মার্জিত, কিংবা যে অনেক ঐক্যমত্য), আপনার সম্পদ যোগ routes.rb। বাদে এটি কাজ করে না form_for। আমার কিছুটা স্পষ্টতা দরকার! উপরের পছন্দগুলি ছাঁটাই করার জন্য, আমার অপশনগুলি

  1. সুপারক্লাসের নিয়ামকটিতে সাবক্লাসের সংস্থানগুলি ম্যাপ করুন routes.rb(এবং আশা করি কোনও সাবক্লাসে আমাকে ফর্ম_ কল করার প্রয়োজন নেই)
  2. ক্লাসগুলি একে অপরের সাথে মিথ্যা তৈরি করার জন্য রেলগুলি অভ্যন্তরীণ পদ্ধতিগুলিকে ওভাররাইড করুন
  3. কোডটিতে প্রতিটি উদাহরণ সম্পাদনা করুন যেখানে কোনও বস্তুর ক্রিয়াটির পথটি স্পষ্টভাবে বা স্পষ্টতই আহবান করা হয়েছে, হয় পাথ পরিবর্তন করা বা অবজেক্টটিকে টাইপ-কাস্টিং করা।

এই সমস্ত বিতর্কিত উত্তর সহ, আমার একটি রায় দরকার। আমার কাছে মনে হয় ভালো উত্তর নেই। এটি কি রেলের নকশায় ব্যর্থ? যদি তাই হয় তবে এটি কি কোনও বাগটি স্থির হয়ে যেতে পারে? বা যদি তা না হয় তবে আমি আশা করছি যে কেউ আমাকে সরাসরি এটির উপর ভিত্তি করে নিতে পারেন, প্রতিটি বিকল্পের উপকারিতা এবং বিভ্রান্তির মধ্য দিয়ে আমাকে চলতে পারেন (বা কেন এটি কোনও বিকল্প নয় তা ব্যাখ্যা করুন), এবং কোনটি সঠিক উত্তর এবং কেন। বা একটি সঠিক উত্তর আছে যা আমি ওয়েবে খুঁজে পাচ্ছি না?


1
অ্যালেক্স রিজনারের কোডে একটি টাইপ ছিল, যা আমি তার ব্লগে মন্তব্য করার পরে সে ঠিক করে ফেললাম। সুতরাং আশা করি এখন অ্যালেক্সের সমাধানটি কার্যকর is আমার প্রশ্ন এখনও দাঁড়িয়ে: সঠিক সমাধান কোনটি?
ziggurism

1
যদিও এটি প্রায় তিন বছরের পুরানো, আমি এই ব্লগ পোস্টটি rookieonrails.blogspot.com/2008/01/… এবং রেলের মেইলিং তালিকা থেকে লিঙ্কযুক্ত কথোপকথনটি তথ্যবহুল। প্রতিক্রিয়াশীলদের মধ্যে একটি পলিমারফিক হেল্পার এবং নামযুক্ত সহায়কদের মধ্যে পার্থক্য বর্ণনা করে।
ziggurism

2
একটি বিকল্প যা আপনি তালিকাভুক্ত করবেন না তা হ'ল রেলগুলি প্যাচ করা যাতে লিঙ্ক_ টু, ফর্ম_এর মতো এবং একক টেবিলের উত্তরাধিকারের মতো সুন্দর জায়গা। এটি একটি কঠিন কাজ হতে পারে, তবে এটি এমন কিছু যা আমি স্থির দেখতে পছন্দ করি।
এম স্কট ফোর্ড

উত্তর:


140

এটি হ'ল সহজ সমাধান যা আমি ন্যূনতম পার্শ্ব প্রতিক্রিয়া নিয়ে আসতে সক্ষম হয়েছি।

class Person < Contact
  def self.model_name
    Contact.model_name
  end
end

এখন প্রত্যাশায় url_for @personমানচিত্র তৈরি contact_pathকরবে।

এটি কীভাবে কাজ করে: ইউআরএল সাহায্যকারীরা YourModel.model_nameমডেলটির প্রতিফলন এবং একক / বহুবচন রুট কীগুলি উত্পন্ন করার জন্য নির্ভর করে । এখানে Personমূলত বলা হচ্ছে আমি ঠিক ছেলের মতো Contact, তাকে জিজ্ঞাসা করুন


4
আমি একই কাজ করার কথা ভাবছিলাম, তবে ভেবেছিলাম যে # মডেল_নামটি রেলের অন্য কোথাও ব্যবহার করা যেতে পারে এবং এই পরিবর্তনটি স্বাভাবিক কার্যক্রমে ব্যাহত হতে পারে। কোন চিন্তা?
nkassis

3
আমি রহস্যজনক অপরিচিত @ এনকাসিসিসের সাথে সম্পূর্ণ সম্মত। এটি একটি দুর্দান্ত হ্যাক, তবে আপনি কীভাবে জানবেন যে আপনি রেলের অভ্যন্তরীণ অংশগুলি আবদ্ধ করছেন না?
tsherif

6
চশমা। এছাড়াও, আমরা এই কোডটি উত্পাদনে ব্যবহার করি এবং আমি প্রমাণ করতে পারি যে এটি কোনও গোলমাল করছে না: 1) আন্তঃ মডেল সম্পর্ক, 2) এসটিআই মডেল ইনস্ট্যান্টেশন (মাধ্যমে build_x/ create_x)। অন্যদিকে, ম্যাজিকের সাথে খেলার মূল্য হ'ল আপনি কখনই পরিবর্তন করতে পারবেন না 100% নিশ্চিত।
প্রথম থানানার্ট

10
আপনি শ্রেণীর উপর নির্ভর করে গুণাবলীর জন্য পৃথক পৃথক মানুষের নাম রাখার চেষ্টা করলে এটি আই 18n কেটে যায়।
রুফো সানচেজ

4
এটি সম্পূর্ণরূপে ওভাররাইড করার পরিবর্তে, আপনার প্রয়োজনীয় বিটগুলি কেবল ওভাররাইড করতে পারেন। দেখুন gist.github.com/sj26/5843855
sj26

47

আমারও একই সমস্যা ছিল। এসটিআই ব্যবহার করার পরে, form_forপদ্ধতিটি ভুল শিশু ইউআরএল পোস্ট করছিল।

NoMethodError (undefined method `building_url' for

আমি বাচ্চাদের ক্লাসগুলির জন্য অতিরিক্ত রুটে যুক্ত করে এগুলি একই নিয়ামকের দিকে ইশারা করে শেষ করেছি

 resources :structures
 resources :buildings, :controller => 'structures'
 resources :bridges, :controller => 'structures'

উপরন্তু:

<% form_for(@structure, :as => :structure) do |f| %>

এই ক্ষেত্রে কাঠামো আসলে একটি বিল্ডিং (শিশু শ্রেণি)

এটি জমা দেওয়ার পরে আমার পক্ষে কাজ করছে বলে মনে হচ্ছে form_for


2
এটি কাজ করে, তবে আমাদের রুটে প্রচুর অযৌক্তিক পথ জুড়ে। কম অনুপ্রেরণামূলক উপায়ে এটি করার কোনও উপায় নেই?
অ্যান্ডারস কিন্ডবার্গ

1
আপনি আপনার রুটস.আরবি ফাইলটিতে প্রোগ্রামগুলি রুটগুলি সেটআপ করতে পারেন, যাতে আপনি শিশু রুটগুলি সেটআপ করতে সামান্য মেটা প্রোগ্রামিং করতে পারেন। যাইহোক, পরিবেশে যেখানে ক্লাসগুলি ক্যাশে করা হয় না (যেমন উন্নয়ন) আপনার প্রথমে ক্লাসগুলি প্রি-লোড করা দরকার। সুতরাং একটি উপায় বা অন্যটি আপনাকে কোথাও কোথাও সাবক্ল্যাস নির্দিষ্ট করতে হবে। উদাহরণস্বরূপ gist.github.com/1713398 দেখুন ।
ক্রিস ব্লুম

আমার ক্ষেত্রে, ব্যবহারকারীর কাছে অবজেক্টের নাম (পাথ) প্রকাশ করা বাঞ্ছনীয় নয় (এবং ব্যবহারকারীর জন্য বিভ্রান্তিকর)।
লাফস্ট

33

আমি আপনাকে এক নজরে দেখার পরামর্শ দিই: https://stackoverflow.com/a/605172/445908 , এই পদ্ধতিটি ব্যবহার করা আপনাকে "form_for" ব্যবহার করতে সক্ষম করবে।

ActiveRecord::Base#becomes

2
এটির রেন্ডার এবং সঠিকভাবে সংরক্ষণ করা উভয়ের জন্য আমাকে স্পষ্টরূপে ইউআরএল সেট করতে হয়েছিল। <%= form_for @child, :as => :child, url: @child.becomes(Parent)
lulalala

4
@ লুলালালা চেষ্টা করুন<%= form_for @child.becomes(Parent)
রিচার্ড জোন্স

18

প্রকার ব্যবহার করুনরুটে :

resources :employee, controller: 'person', type: 'Employee' 

http://samurails.com/tutorial/single-table-inheritance-with-rails-4-part-2/


ডোমেন পরিবর্তিত হয়েছে, উল্লিখিত নিবন্ধটি এখন সেখানে উপলব্ধ: samurails.com/tutorial/…
T_Dnzt

পোস্ট এবং মন্তব্যে লিঙ্কগুলি নিহত
sasquatch

14

@ প্রথা থাননার্টের ধারণা অনুসরণ করে কিন্তু কিছুই নষ্ট করার চেষ্টা করছেন না। (যেহেতু অনেক জাদু জড়িত রয়েছে)

class Person < Contact
  model_name.class_eval do
    def route_key
     "contacts"
    end
    def singular_route_key
      superclass.model_name.singular_route_key
    end
  end
end

এখন url_for @ پريس প্রত্যাশায় যোগাযোগ_পথের মানচিত্র তৈরি করবে।


14

আমিও এই সমস্যাটি নিয়ে সমস্যায় পড়েছিলাম এবং আমাদের অনুরূপ প্রশ্নের উত্তর দিয়ে এসেছি। এটা আমার জন্য কাজ করেছে।

form_for @list.becomes(List)

উত্তর এখানে দেখানো হয়েছে: একই নিয়ামক দিয়ে এসটিআই পথ ব্যবহার করে

.becomesপদ্ধতি হিসাবে প্রধানত আপনার মত STI সমস্যা সমাধানে জন্য ব্যবহৃত সংজ্ঞায়িত করা হয় form_forনা।

.becomesএখানে তথ্য: http://apidock.com/rails/ActtiveRecord/Base/becomes

সুপার দেরিতে প্রতিক্রিয়া, তবে এটি আমি খুঁজে পেতে পারি সেরা উত্তর এবং এটি আমার পক্ষে ভালভাবে কাজ করেছে। আশা করি এটি কিছুটা সাহায্য করবে। চিয়ার্স!


5

ঠিক আছে, রেলের এই অঞ্চলে আইভের প্রচুর হতাশা ছিল, এবং নিম্নলিখিত পদ্ধতিতে এসে পৌঁছেছি, সম্ভবত এটি অন্যকে সহায়তা করবে।

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

আমি নীচের পদ্ধতির প্রয়োগ করেছি যা মডেল সাবক্লাসগুলির ইনস্ট্যান্টেশন সমর্থন করে এবং উপরের সংকোচন সমস্যা থেকে নিরাপদ। এটি রেল 4 যা কি করে তার সাথে অনেকটাই সমান, তবে একের অধিক স্তরের সাবক্লাসিংয়ের অনুমতি দেয় (রেল 4 এর বিপরীতে) এবং রেল 3-এ কাজ করে।

# initializers/acts_as_castable.rb
module ActsAsCastable
  extend ActiveSupport::Concern

  module ClassMethods

    def new_with_cast(*args, &block)
      if (attrs = args.first).is_a?(Hash)
        if klass = descendant_class_from_attrs(attrs)
          return klass.new(*args, &block)
        end
      end
      new_without_cast(*args, &block)
    end

    def descendant_class_from_attrs(attrs)
      subclass_name = attrs.with_indifferent_access[inheritance_column]
      return nil if subclass_name.blank? || subclass_name == self.name
      unless subclass = descendants.detect { |sub| sub.name == subclass_name }
        raise ActiveRecord::SubclassNotFound.new("Invalid single-table inheritance type: #{subclass_name} is not a subclass of #{name}")
      end
      subclass
    end

    def acts_as_castable
      class << self
        alias_method_chain :new, :cast
      end
    end
  end
end

ActiveRecord::Base.send(:include, ActsAsCastable)

উপরোক্ত পরামর্শের মতো অনেকগুলি 'ডেভলপমেন্ট ইস্যুতে সাবলক্লাস লোডিং' এর জন্য বিভিন্ন পদ্ধতির চেষ্টা করার পরে, আমি কেবলমাত্র আমার মডেল ক্লাসে 'প্রয়োজনীয়তা_ নির্ভরতা' ব্যবহার করা নির্ভরযোগ্যতার সাথে কাজ করেছিলাম found এটি নিশ্চিত করে যে শ্রেণি লোডিং উন্নয়নে যথাযথভাবে কাজ করে এবং উত্পাদনে কোনও সমস্যা না করে। বিকাশে, 'আবশ্যক_নির্ভরতা' ছাড়াই এআর সমস্ত উপশ্রেণীর সম্পর্কে জানতে পারবেন না, যা টাইপ কলামে মিলার জন্য এসকিউএলকে প্রভাবিত করে। 'প্রয়োজনীয়_ নির্ভরতা' ছাড়াও আপনি একই পরিস্থিতিতে মডেল ক্লাসের একাধিক সংস্করণ সহ একটি পরিস্থিতিতে শেষ করতে পারেন! (উদাহরণস্বরূপ, আপনি যখন বেস বা মধ্যবর্তী শ্রেণি বদলাবেন তখনই এটি ঘটতে পারে, সাব-ক্লাসগুলি সর্বদা পুনরায় লোড করার মতো মনে হয় না এবং পুরানো শ্রেণি থেকে সাবক্লাসিং ছেড়ে যায়)

# contact.rb
class Contact < ActiveRecord::Base
  acts_as_castable
end

require_dependency 'person'
require_dependency 'organisation'

আমি উপরে উল্লিখিত মডেল-নামটিকে ওভাররাইডও করি না কারণ আমি I18n ব্যবহার করি এবং বিভিন্ন সাবক্লাসের বৈশিষ্ট্যগুলির জন্য বিভিন্ন স্ট্রিং প্রয়োজন, যেমন: ট্যাক্স_অন্টিফায়ার সংস্থার জন্য 'এবিএন', এবং ব্যক্তি (অস্ট্রেলিয়ায়) জন্য 'টিএফএন' হয়ে ওঠে।

আমি টাইপটি সেট করে উপরের পরামর্শ অনুসারে রুট ম্যাপিংও ব্যবহার করি:

resources :person, :controller => 'contacts', :defaults => { 'contact' => { 'type' => Person.sti_name } }
resources :organisation, :controller => 'contacts', :defaults => { 'contact' => { 'type' => Organisation.sti_name } }

রুট ম্যাপিংয়ের পাশাপাশি আমি ইনহেরিটেড রিসোর্সস এবং সিম্পলফর্ম ব্যবহার করছি এবং আমি নতুন ক্রিয়াকলাপের জন্য নিম্নলিখিত জেনেরিক ফর্ম র‌্যাপারটি ব্যবহার করছি:

simple_form_for resource, as: resource_request_name, url: collection_url,
      html: { class: controller_name, multipart: true }

... এবং সম্পাদনা ক্রিয়াগুলির জন্য:

simple_form_for resource, as: resource_request_name, url: resource_url,
      html: { class: controller_name, multipart: true }

এবং এই কাজটি করার জন্য, আমার বেস রিসোর্সস কনটোলারটিতে আমি ইনরিটেড রিসোর্সের রিসোর্স_রেকুইস্ট_নামটি দেখার জন্য সহায়ক পদ্ধতি হিসাবে প্রকাশ করি:

helper_method :resource_request_name 

যদি আপনি ইনহরাইটেড রিসোর্সগুলি ব্যবহার না করে থাকেন তবে আপনার 'রিসোর্স কনট্রোলার' এ নিম্নলিখিতগুলির মতো কিছু ব্যবহার করুন:

# controllers/resource_controller.rb
class ResourceController < ApplicationController

protected
  helper_method :resource
  helper_method :resource_url
  helper_method :collection_url
  helper_method :resource_request_name

  def resource
    @model
  end

  def resource_url
    polymorphic_path(@model)
  end

  def collection_url
    polymorphic_path(Model)
  end

  def resource_request_name
    ActiveModel::Naming.param_key(Model)
  end
end

অন্যের অভিজ্ঞতা এবং উন্নতি শুনে সর্বদা খুশি।


আমার অভিজ্ঞতায় (কমপক্ষে রেল .9.০.৯ এ), স্ট্রিং দ্বারা নামকরণ করা ধ্রুবকটি ইতিমধ্যে বিদ্যমান না থাকলে কনস্ট্যান্টাইজ ব্যর্থ হয়। সুতরাং এটি স্বেচ্ছাসেবী নতুন চিহ্ন তৈরি করতে কীভাবে ব্যবহার করা যেতে পারে?
লেক্স লিন্ডসে

4

আমি সম্প্রতি একটি রেল 3.0 অ্যাপে কাজ করে একটি স্থিতিশীল এসটিআই প্যাটার্ন পাওয়ার জন্য আমার প্রচেষ্টা ডকুমেন্ট করেছি। এখানে টিএল; ডিআর সংস্করণ:

# app/controllers/kase_controller.rb
class KasesController < ApplicationController

  def new
    setup_sti_model
    # ...
  end

  def create
    setup_sti_model
    # ...
  end

private

  def setup_sti_model
    # This lets us set the "type" attribute from forms and querystrings
    model = nil
    if !params[:kase].blank? and !params[:kase][:type].blank?
      model = params[:kase].delete(:type).constantize.to_s
    end
    @kase = Kase.new(params[:kase])
    @kase.type = model
  end
end

# app/models/kase.rb
class Kase < ActiveRecord::Base
  # This solves the `undefined method alpha_kase_path` errors
  def self.inherited(child)
    child.instance_eval do
      def model_name
        Kase.model_name
      end
    end
    super
  end  
end

# app/models/alpha_kase.rb
# Splitting out the subclasses into separate files solves
# the `uninitialize constant AlphaKase` errors
class AlphaKase < Kase; end

# app/models/beta_kase.rb
class BetaKase < Kase; end

# config/initializers/preload_sti_models.rb
if Rails.env.development?
  # This ensures that `Kase.subclasses` is populated correctly
  %w[kase alpha_kase beta_kase].each do |c|
    require_dependency File.join("app","models","#{c}.rb")
  end
end

এই তালিকাটি আপনার তালিকাভুক্ত সমস্যাগুলির পাশাপাশি অন্যটি এসটিআই পদ্ধতির সাথে অন্যান্য সমস্যার সমাধান করেছে around


2

আপনার যদি নেস্টেড রুট না থাকে তবে আপনি এটি ব্যবহার করে দেখতে পারেন:

resources :employee, path: :person, controller: :person

অথবা আপনি অন্য কোনও পথে যেতে পারেন এবং এখানে বর্ণিত মতো কিছু ওওপি-যাদু ব্যবহার করতে পারেন: https://coderwall.com/p/yijmuq

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


2

এটি ফর্মগুলিতে এবং আমরা ব্যবহার করি এমন আপনার অ্যাপ্লিকেশন জুড়ে কাজ করার একটি নিরাপদ পরিষ্কার উপায়।

resources :districts
resources :district_counties, controller: 'districts', type: 'County'
resources :district_cities, controller: 'districts', type: 'City'

তারপর আমি আমার ফর্ম আছে। এর জন্য যুক্ত টুকরাটি হ'ল: জেলা।

= form_for(@district, as: :district, html: { class: "form-horizontal",         role: "form" }) do |f|

আশাকরি এটা সাহায্য করবে.


2

সবচেয়ে পরিষ্কার সমাধান আমি পেয়েছি বেস ক্লাসে নিম্নলিখিতগুলি যুক্ত করা:

def self.inherited(subclass)
  super

  def subclass.model_name
    super.tap do |name|
      route_key = base_class.name.underscore
      name.instance_variable_set(:@singular_route_key, route_key)
      name.instance_variable_set(:@route_key, route_key.pluralize)
    end
  end
end

এটি সমস্ত সাবক্লাসের জন্য কাজ করে এবং পুরো মডেল নেম অবজেক্টকে ওভাররাইড করার চেয়ে অনেক নিরাপদ। কেবল রুট কীগুলি লক্ষ্যবস্তু করে, আমরা I18n না ভাঙা বা রেলগুলির দ্বারা সংজ্ঞায়িত হিসাবে মডেল নামটি ওভাররাইড করে যে কোনও সম্ভাব্য পার্শ্ব প্রতিক্রিয়া ঝুঁকি না নিয়ে রাউটিং সমস্যার সমাধান করি।


1

যদি আমি এটির মতো কোনও এসটিআই উত্তরাধিকার বিবেচনা করি:

class AModel < ActiveRecord::Base ; end
class BModel < AModel ; end
class CModel < AModel ; end
class DModel < AModel ; end
class EModel < AModel ; end

'অ্যাপ / মডেল / a_model.rb' এ আমি যুক্ত করেছি:

module ManagedAtAModelLevel
  def model_name
    AModel.model_name
  end
end

এবং তারপরে এ্যামোডেল ক্লাসে:

class AModel < ActiveRecord::Base
  def self.instanciate_STI
    managed_deps = { 
      :b_model => true,
      :c_model => true,
      :d_model => true,
      :e_model => true
    }
    managed_deps.each do |dep, managed|
      require_dependency dep.to_s
      klass = dep.to_s.camelize.constantize
      # Inject behavior to be managed at AModel level for classes I chose
      klass.send(:extend, ManagedAtAModelLevel) if managed
    end
  end

  instanciate_STI
end

সুতরাং আমি এমনকি সহজেই আমি বেছে নিতে পারি যে আমি কোন মডেলটি ডিফল্টরূপে ব্যবহার করতে চাই এবং এটি এমনকি উপ-শ্রেণীর সংজ্ঞাটিকে স্পর্শ না করেই বেছে নিতে পারি। খুব শুষ্ক.


1

এইভাবে আমার জন্য কাজ করে ঠিক আছে (বেস পদ্ধতিতে এই পদ্ধতিটি সংজ্ঞায়িত করুন):

def self.inherited(child)
  child.instance_eval do
    alias :original_model_name :model_name
    def model_name
      Task::Base.model_name
    end
  end
  super
end

1

আপনি এমন পদ্ধতি তৈরি করতে পারেন যা পার্পাউজ রাউটিংয়ের জন্য ডামি প্যারেন্ট অবজেক্টটি ফিরিয়ে দেয়

class Person < ActiveRecord::Base      
  def routing_object
    Person.new(id: id)
  end
end

এবং তারপরে @ form_for @ কর্মচারীকে কল করুন r


1

@ প্রথন-থানান্ট উত্তর অনুসরণ করে এবং একাধিক এসটিআই ক্লাসগুলির জন্য, আপনি নিম্নলিখিতটি প্যারেন্ট মডেলটিতে যোগ করতে পারেন ->

class Contact < ActiveRecord::Base
  def self.model_name
    ActiveModel::Name.new(self, nil, 'Contact')
  end
end

যে হিসাবে প্যারাম পাঠাতে যোগাযোগ ডেটার সাথে আপনাকে প্রতিটি ফরমের করতে হবে params[:contact]পরিবর্তে params[:contact_person], params[:contact_whatever]


-6

হ্যাকিশ, তবে সমাধানের তালিকায় অন্য একটি।

class Parent < ActiveRecord::Base; end

Class Child < Parent
  def class
    Parent
  end
end

রেল 2.x এবং 3.x এ কাজ করে


5
এটি একটি সমস্যা সমাধান করে তবে অন্যটি তৈরি করে। এখন আপনি যখন Child.newএটি করার চেষ্টা করছেন Parentতখন সাবক্লাসের পরিবর্তে একটি ক্লাস প্রদান করে। এর অর্থ হ'ল আপনি কন্ট্রোলারের মাধ্যমে ভর অ্যাসাইনমেন্টের মাধ্যমে সাবক্লাসগুলি তৈরি করতে পারবেন না (যেহেতু typeডিফল্টরূপে সুরক্ষিত একটি বৈশিষ্ট্য) আপনি টাইপ বৈশিষ্ট্যটি স্পষ্টভাবে সেট না করে থাকেন।
ক্রিস ব্লুম 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.