পরামিতিগুলির সাথে পূর্ববর্তী ফিল্টার


84

আমার একটি পদ্ধতি রয়েছে যা এই জাতীয় কিছু করে:

before_filter :authenticate_rights, :only => [:show]

def authenticate_rights
  project = Project.find(params[:id])
  redirect_to signin_path unless project.hidden
end

আমি এই পদ্ধতিটি অন্য কয়েকটি কন্ট্রোলারগুলিতেও ব্যবহার করতে চাই, তাই আমি এই পদ্ধতিটি অনুলিপি করেআপনি_কন্ট্রোলারের অন্তর্ভুক্ত কোনও সহায়কের কাছে অনুলিপি করেছিলাম।

সমস্যাটি হ'ল, কিছু নিয়ন্ত্রকের ক্ষেত্রে, প্রকল্পের আইডি :idপ্রতীক নয় তবে ফে :project_id(এবং এছাড়াও :idউপস্থিত রয়েছে (অন্য মডেলের জন্য)

আপনি কীভাবে এই সমস্যার সমাধান করবেন? পূর্ব_ ফিল্টার ক্রিয়ায় (ডান প্যারামটি পাস করার জন্য) একটি প্যারামিটার যুক্ত করার বিকল্প আছে কি?

উত্তর:


86

আমি এটি এইভাবে করব:

before_filter { |c| c.authenticate_rights correct_id_here }

def authenticate_rights(project_id)
  project = Project.find(project_id)
  redirect_to signin_path unless project.hidden
end

যেখানে correct_id_hereঅ্যাক্সেসের জন্য প্রাসঙ্গিক আইডি Project


4
,:only => [:show]প্রতীক যুক্ত করার উপায় আছে কি? আমি চেষ্টা করার সময় একটি ত্রুটি পেয়ে করছিbefore_filter { |c| c.authenticate_rights correct_id_here }, :only => [:show]
choise

27
অন্যান্য উপায় কাছাকাছি চেষ্টা করুন: before_filter(:only => [:show]) { <block_code_here> }। আরও উদাহরণ এখানে: apidock.com/rails/ActionController/Filters/ClassMethods/…
fguillen

4
আপনি যদি before_filterকোনও ব্যক্তিগত পদ্ধতি তৈরি করে এটি সুরক্ষিত করেন , তবে সম্ভবত পুনরায় ফ্যাক্টর (যেমন এটি প্যারেন্ট কন্ট্রোলার, অ্যাপ্লিকেশন কনট্রোলার ইত্যাদিতে সরান), আপনাকে c.send(:filter_name, ...)নিয়ন্ত্রণকারীর প্রসঙ্গে ফিল্টারটি চলবে না বলে ব্যবহার করতে হবে। গাইড.আরবিওনরইলস.আর.২
রিচার্ড মাইকেল

4
এটি করার ফলে এটি পূর্বে_ ফিল্টার নামের (প্রোক) অভাবের কারণে ওভাররাইড / এড়ানো যায় না। আমি যে মানগুলিতে পাস করতে চাই তা হ'ল শ্রেণী স্তর। এটা কি সম্ভব?
অরিওশেকে

4
@ ইউরোশকে: আমারও একই সমস্যা আছে। আপনি কি সমাধান খুঁজে পেয়েছেন?
marcus3006

67

কিছু সিনট্যাকটিক চিনি সহ:

before_filter -> { find_campaign params[:id] }, only: [:show, :edit, :update, :destroy]

বা আপনি যদি আরও অভিনব হওয়ার সিদ্ধান্ত নেন:

before_filter ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|

এবং যেহেতু রেলস 4 এর before_actionসমার্থক শব্দ before_filterচালু হয়েছিল, তাই এটি এ হিসাবে লেখা যেতে পারে:

before_action ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|

এনবি

->এর অর্থ দাঁড়ায় lambda, যাকে ল্যাম্বডা আক্ষরিক বলা হয় , এটি রুবি ১.৯-এ প্রবর্তন করুন

%i প্রতীক একটি অ্যারে তৈরি করবে


4
এই উত্তরটি আরও মার্জিত কারণ ল্যাম্বদা ক্লাসের সম্পাদন প্রসঙ্গে ডিফল্ট, তাই ব্যক্তিগত পদ্ধতি '.সেন্ড' ব্যবহার না করে বলা যেতে পারে
ডেভিড পেলাইজ

@ ভ্যাডিম টাইমিরভ find_campaignব্যক্তিগত পদ্ধতির নাম? ইন param=params[:id], paramনতুন স্থানীয় ভেরিয়েবলের নামটি find_campaignকী যুক্তি হিসাবে পাস হবে ? অর্থ, যে find_campaignনিজেই ব্যক্তিগত পদ্ধতিতে, আমরা ব্যবহার করি paramনা params{:id],?
আহ্নবিজক্যাড

4
find_campaignহয় হতে পারে, তবে আমি এটি ব্যক্তিগত করে নিশ্চিত করেছিলাম যে আমরা কী খাওয়া হয় না তা প্রকাশ করি না। paramsআমাদের পদ্ধতিগুলির জন্য একটি হ্যাশ ভেরিয়েবল উপলব্ধ, paramকোনও পরিবর্তনশীল যা আপনাকে সন্ধান_ ক্যাম্পেইন পদ্ধতিতে পাস করতে হবে, উদাহরণস্বরূপbefore_action ->(campaign_id=params[:id]) { find_campaign(campaign_id) }, only: %i| show edit update destroy |
ভডিয়াম তায়মিরভ

14

@ অ্যালেক্সের উত্তরটি অবিরত রাখতে, আপনি যদি কিছু পদ্ধতি :exceptবা :onlyকিছু করতে চান তবে বাক্য গঠনটি এখানে:

before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end 

এখানে পাওয়া গেছে


5

আমি ব্লক পদ্ধতিটি do...endপরিষ্কার বিকল্প হিসাবে পরিবর্তে কোঁকড়ানো ধনুর্বন্ধনী ব্যবহার করে ব্যবহার করি

before_action(only: [:show]) { authenticate_rights(id) }

before_action এর জন্য কেবল নতুন পছন্দসই সিনট্যাক্স before_filter


-1

এই কাজ করা উচিত:

project = Project.find(params[:project_id] || params[:id])

এটি params[:project_id]পরম হ্যাশগুলিতে উপস্থিত params[:id]থাকলে এটি ফিরে আসবে, বা এটি না থাকলে ফিরে আসবে ।


সমস্যাটি হ'ল, কখনও কখনও উভয় উপস্থিত থাকে (নেস্টেড) এবং এটি এমন একটি প্রকল্প খুঁজে পায় যা সঠিক নয়।
চয়েস

@ কোয়েজ: এটি হওয়া উচিত নয়: project_idউপস্থিত থাকলে orধারাটি নিশ্চিত করা হবে যে এটি ব্যবহৃত হয়েছে - কেবল যদি project_idসরবরাহ না করা হয় তবে পরম idনির্বাচন করা হবে। অন্য কথায়: যখন উভয় পরামিতি সরবরাহ করা হয় তখন orক্লজটি নিশ্চিত করে যে সঠিক মানটি ব্যবহৃত হয়েছে, কারণ এটি সর্বদা পছন্দ করবে project_id। স্বাভাবিকভাবেই, যখন আপনি তন্ন তন্ন উপস্থিত এই পদ্ধতি কল করতে চান, অথবা যখন নেই project_idকিন্তু একজন idযা একটি প্রকল্প রেফারেন্স নেই।
ওলা টুভসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.