মডেলটিতে সাহায্যকারীদের ব্যবহার: আমি কীভাবে সহায়ক নির্ভরতা অন্তর্ভুক্ত করব?


104

আমি এমন একটি মডেল লিখছি যা কোনও পাঠ্য অঞ্চল থেকে ব্যবহারকারী ইনপুট পরিচালনা করে। Http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input এর পরামর্শ অনুসরণ করে , আমি পূর্বের_অডিয়েট ব্যবহার করে ডাটাবেসে সংরক্ষণ করার আগে মডেলের ইনপুটটি সাফ করছি কলব্যাক

আমার মডেলের সম্পর্কিত অংশগুলি দেখতে দেখতে:

include ActionView::Helpers::SanitizeHelper

class Post < ActiveRecord::Base {
  before_validation :clean_input

  ...

  protected

  def clean_input
    self.input = sanitize(self.input, :tags => %w(b i u))
  end
end

বলা বাহুল্য, এটি কাজ করে না। যখন আমি একটি নতুন পোস্ট চেষ্টা করি এবং সংরক্ষণ করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই।

undefined method `white_list_sanitizer' for #<Class:0xdeadbeef>

স্পষ্টতই, স্যানিটাইজহেল্পার এইচটিএমএল :: হোয়াইটলিস্টস্যানিটাইজারের একটি উদাহরণ তৈরি করে, তবে আমি যখন এটি আমার মডেলটিতে মিশ্রিত করি তখন এটি HTML :: হোয়াইটলিস্টসিনিটিজারটি খুঁজে পায় না। কেন? এটি ঠিক করার জন্য আমি এটি সম্পর্কে কী করতে পারি?

উত্তর:


136

কেবল প্রথম লাইনটি নিম্নরূপে পরিবর্তন করুন:

include ActionView::Helpers

এটি কাজ করে তোলে।

আপডেট: রেল 3 ব্যবহারের জন্য:

ActionController::Base.helpers.sanitize(str)

ক্রেডিট লার্নকের উত্তরে যায়


এটি নিজের চেয়ে ভাল আর বলতে পারিনি
টাইল্যান্ডর

4
ধন্যবাদ আমি ক্লাস সংজ্ঞা ভিতরে অন্তর্ভুক্ত সরানোর মাধ্যমে এটি কাজ পেয়েছিলাম।
ও ফ্রেবজাস-দে

4
এই সঙ্গে আমি পেতে stack level too deep। এটি পূর্বের সংরক্ষণ পদ্ধতিতে রয়েছে।
অটোমেটিকো

42
সক্রিয় রেকর্ড মডেলগুলির সাথে দর্শন স্তরগুলির উদ্বেগ মিশ্রন করবেন না। এটি একটি ভয়ানক অনুশীলন একটি আরও ভাল পদ্ধতির হ'ল এআর এর সামনে একটি স্বতন্ত্র ইনপুট ডেটা স্যানিটাইজার অবজেক্ট স্থাপন করা এবং এটি থেকে "পরিষ্কার" বৈশিষ্ট্য পুনরুদ্ধার করা।
একাকী

4
এটি খুব খারাপ সমাধান এবং আগুনের মতো এড়ানো উচিত। রেলগুলি এমভিসি (মডেল ভিউ কন্ট্রোলার) ফ্রেমওয়ার্কের উপর ভিত্তি করে যেখানে সহায়িকা ভিউ অংশে আসে তাই আপনাকে মডেলটির সাথে ভিউ হেল্পার পদ্ধতিগুলি মিশ্রিত করা উচিত নয়।
jedi

135

এটি আপনাকে প্রতিটি মডেলটিতে অ্যাকশনভিউ :: সহায়তাকারী পদ্ধতি লোড করার পার্শ্ব প্রতিক্রিয়া ছাড়াই কেবল সহায়ক সহায়তা দেয়:

ActionController::Base.helpers.sanitize(str)

6
আমার মতো ধীর লোকের জন্য - আপনাকে কিছু অন্তর্ভুক্ত করার দরকার নেই, কেবল অ্যাকশনকন্ট্রোলার ব্যবহার করুন: বেস.হেল্পার্স.সানাইটিজ ("আপনি যে স্ট্রিনে স্যানিটাইজ করতে চান")
এডওয়ার্ড

আপনাকে ধন্যবাদ, কারাগারে 2.3.14 এ কাজ করেছেন যদিও গৃহীত উত্তরটি দেয় নি।
ক্রিসইনডমন্টন

আমি অ্যাপ্লিকেশন_হেল্পারে একটি পদ্ধতি যুক্ত করেছি, তবে আমি এক্সেল কন্ট্রোলার :: বেস.হেল্পার্স.মাই_মোথডো (বিকল্পগুলি) ব্যবহার করে রেল 3.0.০.৩ ব্যবহার করে মডেল থেকে এটি অ্যাক্সেস করতে পারিনি?
টম রসি

36

এটি আমার পক্ষে আরও ভাল কাজ করে:

সাধারণ:

ApplicationController.helpers.my_helper_method

অগ্রিম:

class HelperProxy < ActionView::Base
  include ApplicationController.master_helper_module

  def current_user
    #let helpers act like we're a guest
    nil
  end       

  def self.instance
    @instance ||= new
  end
end

সূত্র: http://makandracards.com/makandra/1307-how-to-use-helper-methods-inside-a-model


4
ApplicationController.master_helper_moduleপাগল 3 এবং 4 দেখা আরো কোনো অস্তিত্ব নেই। ApplicationController.helpersযদিও একটা চমৎকার এক।
শমূয়েল

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

25

আপনার নিজের নিয়ন্ত্রকদের সাহায্যকারীদের অ্যাক্সেস করতে কেবল ব্যবহার করুন:

OrdersController.helpers.order_number(@order)

4
শুধু ব্যবহার করছি ApplicationController.helpers.order_number(@order)। তার মানে এই order_numberছিল যে Order Helper
অবস্থানটি

4
@ ক্রানু তিনি "আপনার নিজের নিয়ন্ত্রকদের কাছ থেকে (আপনার নিজের নিয়ন্ত্রকদের সাহায্যকারীদের) অ্যাক্সেস করতে" "নয়," (নিজের সাহায্যকারীদের অ্যাক্সেস করতে) "বলছেন।
আজেদী 32

12

আপনি যদি my_helper_methodকোনও মডেলের অভ্যন্তর কোনও অভ্যন্তর ব্যবহার করতে চান তবে আপনি লিখতে পারেন:

ApplicationController.helpers.my_helper_method

11

আমি এই পদ্ধতির কোনওটিই সুপারিশ করব না। পরিবর্তে, এটি তার নিজস্ব নামের জায়গার মধ্যে রাখুন।

class Post < ActiveRecord::Base
  def clean_input
    self.input = Helpers.sanitize(self.input, :tags => %w(b i u))
  end

  module Helpers
    extend ActionView::Helpers::SanitizeHelper
  end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.