سؤال

في متجرني عبر الإنترنت، يسمح للمستخدمين بتغيير خصائص معينة لأوامرهم (على سبيل المثال، عنوان الفواتير الخاص بهم)، ولكن ليس غيرهم (على سبيل المثال، عنوان IP نشأة). المسؤولون، من ناحية أخرى، يسمح لهم بالتعديل الكل ترتيب الخصائص.

بالنظر إلى ذلك، كيف يمكنني استخدام :attr_accessible لتأمين نموذج طلبي بشكل صحيح؟ أو هل سأضطر إلى استخدامها لتمييز جميع السمات التي يمكن للمسؤولين تعديلها والامتناع عن استخدامها Order.update_attributes(params[:order]) في تلك الإجراءات المراقبة التي يمكن للمستخدمين العاديين الوصول إليها؟

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

المحلول

بشكل عام، ATTACCESSIBLE ليست الأداة التي تبحث عنها، ولا تأتي القضبان مع أي شيء بنيت به يفعل ما تريد.

إذا كنت ترغب في إجراء سيطرة رائعة على من الذي يمكنه تحديث سمات محددة في نموذج، فيمكنك فعل شيء مثل:

class Order < ActiveRecord::Base
  def update_attributes_as_user(values, user)
    values.each do |attribute, value|
      # Update the attribute if the user is allowed to
      @order.send("#{attribute}=", value) if user.can_modify?(attribute)
    end
    save
  end
end

ثم يمكنك تغيير الخاص بك Order.update_attributes(params[:order]) ل Order.update_attributes_as_user(params[:order], current_user) والافتراض أنك تنفذ User#can_modify? طريقة للعودة TRUE في الحالات الصحيحة، يجب أن تعمل.

نصائح أخرى

كان لدي نفس المشكلة والآن أنا أستخدم هذه الأحجار الكريمة http://github.com/dmitry/attr_accessable_block.

إنه سهل ويستخدم في بعض موقع الإنتاج.

نعم، عليك تعديل الإجراءات، لذلك يتم فحص الأذونات داخل الإجراءات. دعا Order#update_attributes لن تعمل من أجل المستخدم العام.

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

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