سؤال

لدي قضبان 2.1.2 موقع يحتوي فقط على قوالب HTML على سبيل المثال Jobs.html.erb، لذلك عندما أطلب مورد مريح:

www.mysite.com/jobs/1.

إنه يجعل وظيفتي في HTML، ومع ذلك، إذا طلبت:

www.mysite.com/jobs/1.xml.

أحصل على الخطأ:

قالب مفقود وظائف قالب مفقودة / show.xml.erb في عرض المسار C: / مساحة العمل / mysite / التطبيق / المشاهدات

ما هو أسوأ هو أنني أستطيع أن أطلب شيئا مثل

www.mysite.com/jobs/1.xyz.

وفي الواقع أرى الخطأ:

قالب في عداد المفقودين وظائف قالب مفقود / show.xyz.erb في عرض مسار C: / مساحة العمل / mysite / التطبيق / المشاهدات

لتقديم محتوى HTML بشكل رائع، ما هي أنظف وأبسط طريقة لإخبار القضبان التي لا أريد تقديم أي شيء آخر غير ملفات .html.erb.

من المهم أن نلاحظ أن:

  • تحتوي بعض إجراءات التحكم الخاصة بي على مكالمات مشروطة إلى طريقة Render () في حين يستخدم الآخرون سلوك القضبان الافتراضية IE إذا لم تتصل بالتقديم ()، فسيتم تقديم القالب الذي يدعى YealAction.html.erb.
  • لا يستخدم التعليمات البرمجية الخاصة بي الأسلوب RepoundS_To ()

سيكون الأمر رائعا إذا لم يكن الحل في Render / Reads_to على مستوى ما، فعليك تعديل عدد كبير من الإجراءات. ربما هناك طريقة لتكوين القضبان بحيث يتم تقديم قوالب HTML فقط؟

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

المحلول

إذا كنت لا ترغب في استخدام ReadsS_TO، فيمكنك القيام بذلك:

class ApplicationController < ActionController::Base
  before_filter :allow_only_html_requests

  ...

  def allow_only_html_requests
    if params[:format] && params[:format] != "html"
      render :file => "#{RAILS_ROOT}/public/404.html"
    end
  end

  ...

end

سيتم تشغيل ذلك قبل جميع الطلبات والسماح فقط لأولئك الذين لا يحددون التنسيق على الإطلاق، أو تحديد تنسيق HTML من خلال. جميع الآخرين يحصلون على 404'd. يمكنك إنشاء عام / 406.html إذا كنت ترغب في العودة 406 غير مقبول.

نصائح أخرى

في طريقتك، يمكنك ببساطة إزالة السطر:

map.connect ':controller/:action/:id.:format'

ولن يتم توجيه ".xyz"، مما أدى إلى 404 أخطاء /.

يمكنك استخدام القضبان لكل عمل الكتابة خاصية. ما هذا؟ -> من الممكن أيضا تجاوز التعامل مع الموارد القياسية عن طريق المرور في كتلة للاستجابة_ITH تحديد التنسيقات التي تتجاوز لهذا الإجراء:

class UsersController < ApplicationController::Base

  respond_to :html, :xml, :json

  # Override html format since we want to redirect to a different page,
  # not just serve back the new resource
  def create
    @user = User.create(params[:user])
    respond_with(@user) do |format|
      format.html { redirect_to users_path }
    end
  end
end

: باستثناء و: خيارات فقط

يمكنك أيضا تمرير: باستثناء خيارات و: خيارات فقط لدعم التنسيقات فقط لإجراءات محددة (كما تفعل مع قبل_filter):

class UsersController < ApplicationController::Base
  respond_to :html, :only => :index
  respond_to :xml, :json, :except => :show
  ...
end

: أي تنسيق

إذا كنت لا تزال ترغب في استخدام Repound_To ضمن الإجراءات الفردية الخاصة بك، فاستخدم: أي تنسيق مورد يمكن استخدامه كتطابق بطبعات Wildcard مقابل أي تنسيق غير محددة:

class UsersController < ApplicationController::Base

  def index

    @users = User.all

    respond_to do |format|
      format.html
      format.any(:xml, :json) { render request.format.to_sym => @users }
    end
  end
end

يعمل حل بن.

النظر في حل المجالس، على الرغم من. إنه منظف لأنه يسمح بالمرونة عندما تحتاج حتما إلى فتح إجراء لإجراء مكالمة جافا سكريبت أو مكالمة XML. ثم لن تضطر إلى إضافة

skip_before_filter :allow_only_html_requests, :only => [:show]

أنا شخصيا أحب كتلة الاستجابة. انها وصفية جدا.

respond_to do |wants|
  wants.html
 end

أي تنسيق غير محدد في الكتلة سوف تلقائيا تسبب http 406 غير مقبول أن يتم إرجاعها. هذا جيد.

كنت أحصل على طلبات غير حسنة لتنسيق الصورة على ملفات HTML، وتثريث 500 مع MissingTemplate. وبعد لقد أيدت ما يلي في نهاية الإجراء الخاص بي:

def show
  # [...]
  respond_to :html
end

والآن بدلا من الحصول على تقارير الخطأ، نقوم بإنشاء 406 إلى هذا الطالب المؤذ.

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