রেলের জন্য রাউটিং সংস্থাগুলিতে: আইডি প্যারামিটারটির নাম পরিবর্তন করুন


107

আমি গতিশীল প্যারাম স্লট কীভাবে পরিবর্তন করতে পারি তার চারপাশে তাকিয়েছিলাম এবং এই পোস্টটি সন্ধান করে যা সঠিক জিনিসটি করে। পোস্টটি হল https://thoughtbot.com/blog/rails-patch-change-the-name-of-the-id-parameter-in

মূলত এটি যা করে তা হল, নিম্নলিখিতগুলি রুটগুলি অনুসরণ করে:

map.resources :clients, :key => :client_name do |client|
  client.resources :sites, :key => :name do |site|
    site.resources :articles, :key => :title
  end
end

এই রুটগুলি নিম্নলিখিত পাথ তৈরি করে:

/clients/:client_name
/clients/:client_name/sites/:name
/clients/:client_name/sites/:site_name/articles/:title

একটি সমাধান হ'ল def to_paramমডেলটিতে পদ্ধতিটি ওভাররাইড করা , তবে আমি মডেলটি নিজেই স্পর্শ না করেই এটি চাই।

তবে যেহেতু এটি রেল ২.০ এর জন্য, আমি কীভাবে রেল ৩ এর জন্য একই অর্জন করতে পারি?

হালনাগাদ

এই অ্যাপ্লিকেশনটি মঙ্গয়েড ব্যবহার করছে। এআর নয় সুতরাং, মণি বন্ধুত্বপূর্ণ আফাইক ব্যবহার করা যাবে না।

উত্তর:


192

4 এবং 5 এর ভাড়া

রেলস 4 এ, :paramবিকল্পটি যুক্ত করা হয়েছিল, যা মনে হচ্ছে আপনি যা করছেন ঠিক তেমনটি করে। আপনি দেখে নিতে পারেন 3 কোড পাগল তুলনায় পাগল 4 কোড

বিস্তারিত

আপনি সহজেই আপনার routes.rbফাইলটিতে এটি প্রয়োগ করতে পারেন :

# config/routes.rb

resources :posts, param: :slug

# app/controllers/posts_controller.rb

# ...
@post = Post.find_by(slug: params[:slug])
# ...

4 রেলগুলি মুক্তি পাওয়ার পরে, কার্যকারিতাটি রেল গাইডগুলিতে নথিভুক্ত করা হয়েছে

রেল 3

দুর্ভাগ্যক্রমে, রেল 3 এ, এর :keyঅপশনটি resourcesসরিয়ে দেওয়া হয়েছে, সুতরাং আপনি কেবলমাত্র অতিরিক্ত বিকল্পটি পেরিয়ে এভাবে সহজে তৈরি করা রুটের নাম পরিবর্তন করতে পারবেন না।

বিস্তারিত

আমি ধরে নিয়েছি আপনি গত বছরে আপনি যেভাবে চান অ্যাপ্লিকেশনটি ইতিমধ্যে কাজ করে ফেলেছেন তবে আমি আপনার রেল 3 ইন-তে বর্ণিত প্রভাবটি পেতে একটি উপায় যাব routes.rb। এটি to_paramপদ্ধতির চেয়ে কিছুটা বেশি কাজ করবে । আপনি এখনও যাত্রাপথ কাস্টম পরামিতি ব্যবহার নির্ধারণ করা বর্ণনা করতে পারেন scopeএবং match(অথবা এটা এর চাচাতো ভাই get, put, post, এবং delete)। ম্যাচারে আপনি যে প্যারামিটারের নামটি চান তা কেবল লিখুন:

get 'clients/:client_name', :to => 'clients#show', :as => client

scope 'clients/:client_name' do
  get 'sites/:name', :to => 'sites#show', :as => site
end

আপনাকে ম্যানুয়ালি সমস্ত রুট যুক্ত করতে resourcesহবে যা স্বয়ংক্রিয়ভাবে আপনার জন্য তৈরি করে, তবে এটি আপনি যা সন্ধান করছেন তা অর্জন করবে। আপনি পুনরাবৃত্তি কিছু নিতে কার্যকরভাবে অতিরিক্ত :controllerবিকল্পগুলি scopeএবং বিকল্পগুলি ব্যবহার scopeকরতে পারেন।


সম্পাদনা (8 ই মে, 2014): উত্তরটিকে আরও স্পষ্ট করে তুলুন যে উভয়টিই 3 এবং 4 এর জন্য তথ্য রয়েছে তবে সঠিক লাইন নম্বরগুলিতে যেতে কোডের লিঙ্কগুলি আপডেট করুন এবং কমিট করুন যাতে তারা আরও দীর্ঘ সময়ের জন্য কাজ করতে পারে।

সম্পাদনা (নভেম্বর 16, 2014): রেল 4 এখন শীর্ষে থাকা উচিত এবং প্রাসঙ্গিক তথ্য অন্তর্ভুক্ত করা উচিত কারণ এটি বেশ কিছুদিন ধরেই রেলের বর্তমান সংস্করণ।

সম্পাদনা (আগস্ট 9, 2016): প্রতিফলিত করুন যে সমাধানটি এখনও 5 টি রেলগুলিতে কাজ করে এবং পুরানো লিঙ্কগুলিকে আপডেট করে।


1
সুতরাং মূলত, রেলস 3 রাউটারে রিসোর্ফুল হওয়ার জন্য রিসোর্স বিকল্প তৈরি করেছে, তবে কাস্টম ভেরিয়েবলের নাম রাখার জন্য ওভাররাইড করা দরকার ... লম্বা মনে হচ্ছে!
আগস্টিন রিডিংগার

1
paramরেল 3 এর বিকল্পের একটি ব্যাকপোর্ট এখানে রয়েছে : gist.github.com/sj26/44ef47fe8b98b46ee32d
sj26

এটি ইউআরএল হেল্পারদের ভাঙ্গা শুরু করে। আমি যদি কোনও বস্তু পাস করি বা আমি কোনও স্লাগ ইন পাস করি তবে [: স্লাগ] কী সম্পর্কে অভিযোগ করে যদি তারা একটি সাধারণ আইডি ভিত্তিক রুট উত্পন্ন করে থাকে তবে কোনও ধারণা কীভাবে ঠিক করবেন?
রনলগ

9
এফওয়াইআই, যদি আপনি নেস্টেড রিসোর্স ব্যবহার করেন তবে প্যারেন্ট রিসোর্সের পরম হবে post_slugযা বিভ্রান্তিকর হতে পারে।
ghayes

4
এটি সত্যিই ভাল তবে যদি আমি নেস্টেড সংস্থার জন্য পোস্ট_পোস্ট_আইডি এর মতো প্যারামিটার আইডিটির প্যারামিটার নামটি না চাই তবে আমি কী করতে পারি?
আস্নাদ আতা

45

রেলস 4 এ, আইডি প্যারামগুলি পরিবর্তন করতে প্যারাম বিকল্পটি পাস করুন। উদাহরণস্বরূপ resources :photos, param: :photo_name/ ফটো /: ফটো_নাম উত্পন্ন করবে


1

যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি যা চান তা আপনার url এর client_nameপরিবর্তে থাকা উচিত id, তাই না?

আপনি to_paramআপনার মডেলের পদ্ধতিটি ওভাররাইড করে এটি করতে পারেন । আপনি এখানে আরও তথ্য পেতে পারেন ।


1
আমি ইতিমধ্যে উল্লেখ করেছি যে মডেলটি পরিবর্তন না করার আমার প্রতিবন্ধকতা রয়েছে। পূর্ব বর্ণিত উদাহরণটি কি 3 রেলগুলিতে সমর্থিত বা অবচয় নয়?
অটোডিড্যাক্ট

1

এর জন্য একটি রত্ন রয়েছে, যেমন প্রত্যেক কিছুর জন্য একটি মণি রয়েছে;)

রেল 3 এ এই জাতীয় আচরণের জন্য আমি ফ্রেন্ডলিআইড ব্যবহার করছি ।

এটির জন্য আপনার মডেলটিতে কিছু কোড যুক্ত করার প্রয়োজন হবে:

class Client < ActiveRecord::Base
  has_friendly_id :name
end

... এবং যদি আপনার ক্লায়েন্টদের ইউআরআই সামঞ্জস্যপূর্ণ নাম না থাকে তবে আপনি এটির জন্য একটি স্লাগ ব্যবহার করতে পারেন, যা আপনি এটি করতে পারেন has_friendly_id :name, :use_slug => true। স্লাগগুলি ব্যবহার করার সময় আপনাকে অবশ্যই এটি অবশ্যই ডাটাবেসে চালিয়ে যেতে হবে।

এবং ইতিমধ্যে উল্লিখিত হিসাবে, আপনি এখনও এখানেto_param ডকুমেন্ট হিসাবে ট্র্যাক 3 রেল ব্যবহার করতে পারেন । যদিও আমি বন্ধুত্বপূর্ণ কিছুটা আরও বহুমুখী খুঁজে পাই find


আমি বন্ধুত্বপূর্ণ আইডি পছন্দ করি এবং অনেক প্রকল্পে ব্যবহার করেছি। আসলে আমার অ্যাপটি মঙ্গয়েড ব্যবহার করছে। এবং বন্ধুত্বপূর্ণ_আইডি এটি আফিকে সমর্থন করে না। এবং যেমনটি আমি ইতিমধ্যে উল্লেখ করেছি যে আমার সীমাবদ্ধতা মডেলটি পরিবর্তন করার নয়।
অটোডিডাক্ট

1
আপনি যদি মঙ্গোড ব্যবহার করেন তবে এই কার্যকারিতাটি অর্জনের জন্য মঙ্গয়েড-স্লাগ রয়েছে । এটি আসলে ব্যবহার করে to_paramতবে এটি ব্যাকগ্রাউন্ডে কিছু অন্যান্য চালাক স্টাফও করে। আমি এখানে লিঙ্কটি পেয়েছি: stackoverflow.com/questions/4744446/…
ফ্রস্ট

আমি সেই রত্নটি পছন্দ করেছি। অনুরূপ আরেকটি স্লুগয়েড রয়েছে । তবে আমি যেমনটি বলে আসছি যে আমার কাছে মডেলটি পরিবর্তন না করার প্রতিবন্ধকতা রয়েছে। এটি to_paramআমার প্রথম অংশের অ্যাপ্লিকেশনটি ভেঙে দেয়। প্রকৃতপক্ষে আমি রাউটিং পদ্ধতির জন্য মরিয়া হয়ে দেখছি যে আমার অ্যাপ্লিকেশনটি পরিবর্তন করতে হবে তবে মডেল এবং ফ্রন্টএন্ড অংশটি অ্যাপ্লিকেশনটি না ভেঙে। আমি কেবল যেমনটি বলেছি ঠিক তেমনি রুটগুলি পরিবর্তন করতে এবং উপরে রেলের পুরানো সংস্করণের উদাহরণ পোস্টের কেন আমি থাকতে পারি না ???
অটোডিড্যাক্ট

আপনি কি নিজের কন্ট্রোলারদের পুনরায় লেখার চেষ্টা করেছেন যাতে এটি আপনার কাস্টম রুট কীগুলি ব্যবহার করে? উদাহরণ হিসেবে বলা যায় @client = Client.find(:name => param[:client_name]যে ClientsController#show? এটা কাজ করতে পারে।
ফ্রস্ট

Client.where(:name => param[:client_name]).first, এটাই.
ফ্রস্ট

0

3 রেলগুলিতে আপনি নাম স্থান এবং স্কোপের সংমিশ্রণটি ব্যবহার করে আইডি কীগুলির নাম পরিবর্তন করতে পারেন (যদিও খুব সুন্দর নয়):

namespace :clients do
  scope "/:client_name" do
    namespace :sites do
      scope "/:name" do
         post "/:title" => "articles#create"
         ...
      end
    end
  end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.