الموارد المريحة القضبان باستخدام to_param لحقل يحتوي على أحرف فاصل

StackOverflow https://stackoverflow.com/questions/948886

  •  09-09-2019
  •  | 
  •  

سؤال

أريد تطبيق My Rails 2.3.2 للرد على وإنشاء عناوين URL مثل ذلك:

/websites/asd.com
/websites/asd.com/dns_records/new

في التكوين / routes.rb، لدي:

map.resources :websites, :has_many => :dns_records
map.resources :dns_records, :belongs_to => :website

يمكنني بعد ذلك الوصول إلى الموارد مثل:

/websites/1
/websites/1/dns_records

عن طريق تعديل نموذج موقع الويب الخاص بي، يمكنني توليد عناوين URL أفضل مثل:

class Website < ActiveRecord::Base
    def to_param
        domain_name
    end
    ...
end

# app/views/websites/index.erb
<% @websites.each do |w| %>
<%= link_to "Show #{w}", website_path(w) %>
<% end %>

# Produces a link to:
/websites/example_without_periods_in_name

ومع ذلك، لأسماء النطاقات التي تحتوي على "." الشخصيات، القضبان يحصل غير سعيد. أعتقد أن هذا بسبب "." يتم تعريف الحرف في ActionController :: التوجيه :: الفواصل، التي تسرد الأحرف الخاصة لتقسيم عنوان URL الخاص بك. هذا يسمح لك أن تفعل أشياء مثل / websites/1.xml.

لذلك، هل هناك طريقة نظيفة للسماح ". شخصيات في عناوين URL مريحة؟

لقد حاولت إعادة تعريف ActionController :: التوجيه :: فواصل عدم تضمين "."، وهي طريقة سيئة تماما لحل المشكلة. هذا يفسد عناوين URL التي تم إنشاؤها عن طريق إلحاق ".: تنسيق" لهم.

أعلم أيضا أنني أستطيع إضافة: المتطلبات => {id id => regexp} إلى My Config / Routes.rb لتتناسب مع اسم مجال يتضمن "." (بدون هذا، يتم تعيين المعالم [: ID] إلى جزء اسم المجال قبل الأول ".")، ولكن هذا لا يساعد في توليد عناوين URL / مسارات مريحة.

شكرا جزيلا :) نيك

هل كانت مفيدة؟

المحلول

حل المشكلة، مع شكر كبير http://poocs.net/2007/11/14/Special-Characters-NAde-Routes. (ونرى http://dev.rubyonrails.org/ticket/6426. للحصول على مرجع إضافي)

كنت بحاجة إلى إضافة: المتطلبات => {: website_id => regexp} لكل طريق متداخلا كان ذا إدراج أيضا اسم مجال مع فترات فيه.

إليك طريقي العملي:

map.resources :websites, :requirements => { :id => /[a-zA-Z0-9\-\.]+/ } do |websites|
    websites.with_options :requirements => { :website_id => /[a-zA-Z0-9\-\.]+/ }  do |websites_requirements|
        websites_requirements.resources :dns_records
    end
end

<%= link_to 'New DNS Record', new_website_dns_record_path(@website) %>

# Produces the URL
/websites/asd.com/dns_records/new

دعوة إلى

websites.with_options

هو ببساطة تمشيا مع الجافة بحيث: لا يجب تحديد المتطلبات لجميع الطرق المتداخلة للمواقع الإلكترونية. لذلك يمكنني أيضا

websites_requirements.resources :accounts
websites_requirements.resources :monthly_bandwidth_records
etc.

نصائح أخرى

هذه قضية مشوقة. لا أعتقد أنه يمكنك التخلص من السيئ '.:format' إلحاق النهاية إذا كنت تفعل أساسية map.resources. وبعد إذا كنت تريد فترات في الأسماء، فأنت لا تتوافق مع أنماط القضبان المعتادة، وأعتقد أن الطريق المخصص قد يكون من أجل ذلك إذا كنت تماما يحتاج ال '.' في عنوان URL.

ومع ذلك، ربما يجب عليك التفكير في تغيير تعريفك to_param. وبعد ماذا تفكر في استخدام ما يلي؟

def to_param
   domain_name.sub('.','_dot_')
end

أعتقد، إذا كنت تستخدم هذا لإدارة مواقع العملاء، فهذه طريقة أنيقة إلى حد ما لإنشاء عناوين URL لطيفة (وسيو ودية) مثل

/websites/asd_dot_com/dns_records/new
/websites/asd_dot_com/

كان لدي مسألة مماثلة منذ بعض الوقت وجاءت إلى حل مماثل. باستخدام /.+/ كما عملت متطلبات المعلمة المعنية بشكل جيد بالنسبة لي.

http://zargony.com/2009/05/05/05/05/routing-parameters-with-a-dot.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top