Modelde yardımcıları kullanma: yardımcı bağımlılıkları nasıl dahil ederim?


101

Bir metin alanından kullanıcı girişini işleyen bir model yazıyorum. Http://blog.caboo.se/articles/2008/8/25/sanitize-your-users-html-input'taki tavsiyeye uyarak , before_validate'i kullanarak veritabanına kaydetmeden önce modeldeki girdiyi temizliyorum geri aramak.

Modelimin ilgili kısımları şuna benzer:

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

Söylemeye gerek yok, bu işe yaramıyor. Yeni bir Gönderi kaydetmeye çalıştığımda aşağıdaki hatayı alıyorum.

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

Görünüşe göre, SanitizeHelper bir HTML :: WhiteListSanitizer örneği oluşturuyor, ancak onu modelime karıştırdığımda HTML :: WhiteListSanitizer'ı bulamıyor. Neden? Bunu düzeltmek için ne yapabilirim?

Yanıtlar:


133

İlk satırı aşağıdaki gibi değiştirmeniz yeterlidir:

include ActionView::Helpers

bu işe yarayacak.

GÜNCELLEME: Rails 3 kullanımı için:

ActionController::Base.helpers.sanitize(str)

Kredi lornc'un cevabına gidiyor


daha iyi
söyleyemezdim

1
Teşekkürler. Dahil etmeyi sınıf tanımının içine taşıyarak çalışmasını sağladım.
O. Frabjous-Dey

1
Bununla anlıyorum stack level too deep. Bir before_save yöntemindedir.
automático

42
Lütfen görünüm katmanı endişelerini etkin kayıt modelleriyle karıştırmayın. Bu korkunç bir pratik. Çok daha iyi bir yaklaşım, AR'nin önüne bağımsız bir girdi veri temizleyici nesnesi koymak ve ondan "temiz" öznitelikleri almaktır.
solnic

1
Bu çok kötü bir çözümdür ve ateş gibi önlenmelidir. Rails, yardımcının Görünüm bölümünde geldiği MVC (Model Görünüm Denetleyicisi) çerçevesini temel alır, bu nedenle görünüm yardımcı yöntemlerini modelle karıştırmamalısınız.
jedi

132

Bu size her ActionView :: Helpers yöntemini modelinize yüklemenin yan etkileri olmadan yalnızca yardımcı yöntemi verir:

ActionController::Base.helpers.sanitize(str)

6
Benim gibi yavaş insanlar için - herhangi bir şey eklemenize gerek yok, ActionController :: Base.helpers.sanitize ("Temizlemek istediğiniz dizede")
Edward

Teşekkürler, kabul edilen cevap gelmezken Rails 2.3.14'te çalıştı.
ChrisInEdmonton

Application_helper'a bir yöntem ekledim, ancak Rails 3.0.3 kullanarak ActionController :: Base.helpers.my_method (options) kullanarak modelden bu yönteme erişemedim.
Tom Rossi

36

Bu benim için daha iyi çalışıyor:

Basit:

ApplicationController.helpers.my_helper_method

İlerlemek:

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

Kaynak: http://makandracards.com/makandra/1307-how-to-use-helper-methods-inside-a-model


1
ApplicationController.master_helper_moduleRaylar 3 ve göründüğü 4'te artık mevcut değil. Yine ApplicationController.helpersde güzel.
Samuel

Buna (basit seçenek) oy verdim çünkü ihtiyaçlarıma uyuyordu - ApplicationController'da bir önceki filtre tarafından kaydedilen bilgileri kullanan yalnızca bir yardımcıya ihtiyacım var, bu yüzden benim durumumda ilişkiyi açık bir şekilde yapmak bir bağlantı olduğunu hatırlatmaktır. [Kullanım örneği, uygulamaya geri dönen bir url bağlantısı olan bir model bildirimci aracılığıyla e-postalar
yayınlayan çok alanlı bir

24

Yardımcılara kendi denetleyicilerinizden erişmek için şunu kullanın:

OrdersController.helpers.order_number(@order)

2
Sadece kullanıyorum ApplicationController.helpers.order_number(@order). Bu order_number, Order Helper
konumun

3
@rowanu "Kendi denetleyicilerinizden (yardımcılara erişmek için)" değil "(kendi denetleyicilerinizden yardımcılara) erişmek için" diyor.
Ajedi32

12

my_helper_methodBir modelin içini kullanmak istiyorsanız, yazabilirsiniz:

ApplicationController.helpers.my_helper_method

11

Bu yöntemlerden hiçbirini tavsiye etmem. Bunun yerine, kendi ad alanına koyun.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.