রেল রাউটিং সহায়ক (যেমন মায়োডেল_পথ (মডেল)) মডেলগুলিতে ব্যবহার করা যেতে পারে?


368

বলুন আমার কাছে থিং নামে একটি রেল মডেল রয়েছে। আর একটি url অ্যাট্রিবিউট করতে পারে হয়েছে ঐচ্ছিকরূপে ইন্টারনেটে একটি URL কোথাও এ সেট করা। কোড কোডে, আমার যুক্তি প্রয়োজন যা নিম্নলিখিতগুলি করে:

<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>

ভিউতে এই শর্তযুক্ত যুক্তিটি কুৎসিত। অবশ্যই, আমি একটি সহায়ক ফাংশন তৈরি করতে পেরেছিলাম, যা এতে দৃষ্টিভঙ্গি বদলে দেবে:

<%= thing_link('Text', thing) %>

এটি ভারবোসিটি সমস্যা সমাধান করে তবে আমি নিজেই মডেলটিতে কার্যকারিতা থাকা পছন্দ করি। কোন ক্ষেত্রে, ভিউ কোডটি হবে:

<%= link_to('Text', thing.link) %>

এটি অবশ্যই স্পষ্টতই মডেলের একটি লিঙ্ক পদ্ধতি প্রয়োজন। এটিতে কী কী থাকতে হবে তা এখানে:

def link
  (self.url.blank?) ? thing_path(self) : self.url
end

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


ব্যবহারের ক্ষেত্রে এটি হবে: উপরের সেভায় goo.gl থেকে সংক্ষিপ্ত ইউআরএল তৈরি করা
লুলালালা

2
আপনার যদি সম্ভবত ভিউ যুক্তি যুক্ত করতে চান তবে আপনার উপস্থাপকের মডেলটি মোড়ানো উচিত, এটি এমভিসি স্তরগুলি পৃথক করে রাখবে। ড্রপার ( github.com/jcasimir/draper ) দেখুন।
ক্রিস

উত্তর:


698

3, 4, এবং 5 এর মধ্যে আপনি ব্যবহার করতে পারেন:

Rails.application.routes.url_helpers

যেমন

Rails.application.routes.url_helpers.posts_path
Rails.application.routes.url_helpers.posts_url(:host => "example.com")

14
Ypu এটিকে যে কোনও মডিউলে অন্তর্ভুক্ত করতে পারে এবং এর পরে আপনি সেখানে ইউআরএল-হেল্পারদের অ্যাক্সেস করতে পারেন। ধন্যবা
Viacheslav Molokov

41
আপনার :hostবিকল্পটি সর্বত্র অনুলিপি করা থেকে নিজেকে বাঁচান এবং এটি একবার আপনার পরিবেশ কনফিগারেশন ফাইলগুলিতে সেট করুন:Rails.application.routes.default_url_options[:host] = 'localhost:3000'
অ্যান্ড্রু

5
include Rails.application.routes.url_helpers
জানুয়ারী

1
আপনার যদি কেবল সেই পথের প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন: হোস্ট প্যারামিটারটি পাস না করে বিকল্প হিসাবে কেবল_পথ => সত্য।
সত্যিনভিসো

1
: এই ভাল বিকল্প মনে করা হয় hawkins.io/2012/03/...
Renars Sirotins

182

আমি নিজে কীভাবে এটি করতে পারি তার উত্তর আমি খুঁজে পেয়েছি। মডেল কোডের ভিতরে, কেবল লিখুন:

কারাগারের জন্য <= 2:

include ActionController::UrlWriter

রেল 3:

include Rails.application.routes.url_helpers

এই ম্যাজিকালি thing_path(self)বর্তমান জিনিসটির জন্য ইউআরএল ফিরিয়ে দেয়, বা other_model_path(self.association_to_other_model)অন্য কিছু ইউআরএল ফিরিয়ে দেয়।


27
কেবলমাত্র একটি আপডেট, যেহেতু উপরেরটিকে হ্রাস করা হয়েছে। এটি বর্তমান অন্তর্ভুক্ত:include Rails.application.routes.url_helpers
ইয়ালেস্টার

2
আমি যখন << অ্যাকশনভিউ :: বেস: 0x007fe8c0eecbd0> এর জন্য NoMethodError (অপরিজ্ঞাত পদ্ধতি `optize_routes_generation? ') পেয়েছি
moger777

118

আপনি প্রতিটি পদ্ধতির তুলনায় নীচের পদ্ধতির ক্লিনারটিও পেতে পারেন:

class Thing
  delegate :url_helpers, to: 'Rails.application.routes' 

  def url
    url_helpers.thing_path(self)
  end
end

7
এ সম্পর্কিত ডকুমেন্টেশনগুলি খুঁজে পাওয়া কঠিন বলে মনে হয়েছিল, তাই এখানে অ্যাক্টিভসপোর্টে প্রতিনিধিদের ব্যবহার সম্পর্কিত একটি শালীন লিঙ্ক। simonecarletti.com/blog/2009/12/inside-ruby-on-rails-delegate
tlbrack

2
আমি একটি undefined local variable or method 'url_helpers' for Event:Classত্রুটি পেয়েছি ... :(
আগস্টিন রিডিংগার

আমি পেতে undefined method url_helpers। আমি কি করব?
asiniy

@ আসিনী, আপনি কি ইউআরএল_হেলপারদের প্রতিনিধি বিকল্পটি ব্যবহার করেছেন যা শ্রেণির ঘোষণার পরে লেখা?
Krzysztof Witczak

কাজ করে না, তবে এটি হতে পারে আপনি কেবল নিজের তৈরি করা হলে এটিই কাজ করে class, যেমন উত্তরে দেখানো হয়েছে। যদি আপনার মডেল শ্রেণি ইতিমধ্যে প্রসারিত হয় তবে < ApplicationRecordএটি কাজ করবে না?
skplunkerin

13

দৃশ্যে প্রদর্শিত হবে এমন কোনও যুক্তি হেল্পার পদ্ধতিতে অর্পণ করা উচিত, কারণ মডেলের পদ্ধতিগুলি ডেটা পরিচালনা করার জন্য কঠোরভাবে হয়।

আপনি যা করতে পারেন তা এখানে:

# In the helper...

def link_to_thing(text, thing)
  (thing.url?) ? link_to(text, thing_path(thing)) : link_to(text, thing.url)
end

# In the view...

<%= link_to_thing("text", @thing) %>

1
এই ক্ষেত্রে সহায়ক পদ্ধতির বিষয়ে আমি কী পছন্দ করি না: যখন আমি লিংক_ টু_থিং () এর দিকে লক্ষ্য করি তখন আমাকে সিদ্ধান্ত নিতে হয় যে এটি কোনও জিনিস-নির্দিষ্ট বা অ্যাপ্লিকেশন-ব্যাপী সহায়ক (এটি সহজেই হতে পারে) whether উত্সের জন্য আমার 2 টি ফাইল পরীক্ষা করা বিবেচনা করা উচিত। জিনিস.লিংক উত্স ফাইল সম্পর্কে কোনও প্রশ্ন রাখে না।
অ্যারন লংওয়েল 16

এছাড়াও, যদি আমার কোনও রেক টাস্কে এই কার্যকারিতাটি ব্যবহার করার প্রয়োজন হয় (জিনিস ইউআরএলগুলির একটি সিএসভি ফাইল রফতানি করার জন্য) ... সরাসরি মডেলটিতে যাওয়া সেই ক্ষেত্রেও আরও ভাল।
অ্যারন লংওয়েল

তবে পার্থক্যটি হ'ল লিংক_টি মডেলটিতে পাওয়া যাবে না, কারণ এটি অ্যাকশনভিউ সহায়ক। সুতরাং, এটি কাজ করবে না। আপনি মডেলটিতে কিছু অ্যাট্রিবিউট ডিফল্ট হ্যাক করতে পারেন, সুতরাং এটি সেট না করা থাকলে এটি কোনও কিছুর সাথে ডিফল্ট হয়, তবে এটি আপনার উপর নির্ভর করে।
জোশ ডেলসম্যান

12
ওয়েব পরিষেবাদির এপিআইগুলি বাড়ার সাথে সাথে প্রায়শই মডেলগুলিকে তাদের নিজস্ব ডেটা দিয়ে বাহ্যিক সংস্থানগুলিতে যোগাযোগ করা এবং কলব্যাক ইউআরএল সরবরাহ করা প্রয়োজন। উদাহরণস্বরূপ, কোনও ফটো অবজেক্টকে সোশ্যালমোডে নিজেকে পোস্ট করতে হবে, যা সংযম সম্পাদন করা হলে সেই ফটোটির ইউআরএলে ফিরে কল করবে। একটি আফটার_ক্রিয়েট () হুক সোশ্যালমোডে পোস্ট করার অর্থ তৈরি করবে তবে আপনি কীভাবে কলব্যাক ইউআরএল জানেন? আমি মনে করি লেখকের নিজস্ব উত্তরটি ভালভাবে বোঝায়।
জেসনস্মিথ

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

2

আমি সত্যিই পরিষ্কার সমাধান অনুসরণ করতে চান।

class Router
  include Rails.application.routes.url_helpers

  def self.default_url_options
    ActionMailer::Base.default_url_options
  end
end

router = Router.new
router.posts_url  # http://localhost:3000/posts
router.posts_path # /posts

এটি http://hawkins.io/2012/03/ জেনারেটিং_আরলস_ যখনই_আর_ যে কোনও জায়গায়_আপনি_ওয়ান্ট /


1

যদিও কোনও উপায় থাকতে পারে আমি মডেলের বাইরে এই জাতীয় যুক্তি রাখার ঝোঁক রাখব। আমি সম্মত হই যে আপনার দৃষ্টিভঙ্গিটি এটিকে রাখা উচিত নয় ( এটিকে চর্মসার রাখুন ) তবে যদি না মডেল কোনও ইউআরএলকে নিয়ন্ত্রণকারীর কাছে ডেটা টুকরো হিসাবে ফেরত না দেয়, রাউটিং স্টাফটি নিয়ামকের মধ্যে থাকা উচিত।


4
পুনরায়: "যদি না মডেল কোনও ইউআরএল ডেটা টুকরো হিসাবে ফিরিয়ে না দেয়"। ঠিক এখানে যা ঘটছে ... মডেলটি এই টুকরোটির "মালিকানাধীন", যা হয় কোনও সাইট বা অফ-সাইট URL- এর লিঙ্ক। কিছু ক্ষেত্রে ইউআরএলগুলি রেল রাউটিং থেকে উত্পন্ন হয়। অন্যান্য ক্ষেত্রে, ইউআরএল হল ব্যবহারকারী-সরবরাহিত ডেটা।
অ্যারন লংওয়েল 16

0

(সম্পাদনা করুন: আমার আগের ছদ্মবেশ ভুলে যাও ...)

ঠিক আছে, এমন পরিস্থিতি থাকতে পারে যেখানে আপনি হয় মডেল বা অন্য কোনও ইউআরএল যেতে পারবেন ... তবে আমি সত্যিই মনে করি না এটি মডেলটির অন্তর্ভুক্ত, ভিউ (বা সম্ভবত মডেল) আরও উপযুক্ত বলে মনে হচ্ছে।

রুটগুলি সম্পর্কে, যতদূর আমি জানি রুটগুলি নিয়ন্ত্রকদের ক্রিয়ার জন্য (সাধারণত "যাদুকরীভাবে" একটি ভিউ ব্যবহার করে) সরাসরি দেখার জন্য নয়। নিয়ামককে সমস্ত অনুরোধগুলি পরিচালনা করতে হবে, ভিউয়ের ফলাফলগুলি উপস্থিত করা উচিত এবং মডেলটিকে ডেটা পরিচালনা করতে হবে এবং ভিউ বা নিয়ামকের কাছে পরিবেশন করা উচিত। আমি এখানে প্রচুর লোকদের মডেলগুলির পথে যাওয়ার বিষয়ে কথা বলতে শুনেছি (আমি একেবারে বিদায় নিতে শুরু করছি), তবে আমি এটি বুঝতে পেরেছি: রুটগুলি নিয়ন্ত্রণকারীদের কাছে যায়। অবশ্যই অনেকগুলি নিয়ামক একটি মডেলের জন্য নিয়ামক এবং প্রায়শই বলা হয় <modelname>sController(যেমন "ইউজারস কনট্রোলার" "ব্যবহারকারী" মডেলের নিয়ামক)।

যদি আপনি কোনও দৃশ্যে নিজেকে বাজে পরিমাণে যুক্তিযুক্ত লেখার সন্ধান করেন তবে যুক্তিটিকে আরও উপযুক্তভাবে স্থান দেওয়ার চেষ্টা করুন; অনুরোধ এবং অভ্যন্তরীণ যোগাযোগ লজিক সম্ভবত নিয়ন্ত্রকের অন্তর্গত, তথ্য সম্পর্কিত যুক্তি মডেলটিতে স্থাপন করা যেতে পারে (তবে যুক্তি প্রদর্শন নয়, যার মধ্যে লিঙ্ক ট্যাগগুলি অন্তর্ভুক্ত রয়েছে) এবং যুক্তি যা নিখুঁতভাবে প্রদর্শন সম্পর্কিত একটি সহায়কতে স্থাপন করা হবে।


বলুন আপনার কাছে একটি চিত্র মডেল রয়েছে। যদি চিত্রটির সাথে বাইরের ইউআরএল সম্পর্কিত থাকে তবে সেই URL টিতে নির্দেশ করুন। অন্যথায়, কোনও চিত্র আপলোড করতে চিত্রের শো পৃষ্ঠায় ইঙ্গিত করবেন? শুধু একটি ধারণা।
জোশ ডেলসম্যান 16

এই কম জেনেরিক উদাহরণটি সম্পর্কে কীভাবে: লিঙ্ক_ টু "সম্পূর্ণ আকারের চিত্র", ইমেজ.লিংক মডেলটির লিঙ্ক পদ্ধতিটি হয় সাইট ইউআরএল (চিত্র_পথ) এর সাথে লিঙ্ক করবে, বা বলবে, একটি ফ্লিকার URL যদি ব্যবহারকারী সরবরাহ করে এবং .url ছবিতে সেট করা হয়েছিল।
অ্যারন লংওয়েল 16
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.