Raylar - Denetleyicinin İçinde Bir Yardımcı Nasıl Kullanılır


207

bir görünüm içinde bir yardımcı kullanmanız gerektiğini fark ederken, geri dönmek için bir JSON nesnesi oluştururken denetleyicimde bir yardımcıya ihtiyacım var.

Biraz böyle gidiyor:

def xxxxx

   @comments = Array.new

   @c_comments.each do |comment|
   @comments << {
     :id => comment.id,
     :content => html_format(comment.content)
   }
   end

   render :json => @comments
end

html_formatyardımcıma nasıl erişebilirim ?


2
@ grosser'ın cevabını düşünmek isteyebilirsiniz, çok daha eksiksiz.
tokland

Bunun eski olduğunu biliyorum ama ... düz yakut derslerinde sorun nedir? : p
Tarek

Yanıtlar:


205

Not: Bu, Rails 2 gün içinde yazılmış ve kabul edilmiştir; günümüzde grosser'ın cevabı gidilecek yoldur.

Seçenek 1: Muhtemelen en basit yol yardımcı modülün kontrolörünüze dahil edilmesidir:

class MyController < ApplicationController
  include MyHelper

  def xxxx
    @comments = []
    Comment.find_each do |comment|
      @comments << {:id => comment.id, :html => html_format(comment.content)}
    end
  end
end

Seçenek 2: Veya yardımcı yöntemi bir sınıf işlevi olarak bildirebilir ve şöyle kullanabilirsiniz:

MyHelper.html_format(comment.content)

Hem örnek işlevi hem de sınıf işlevi olarak kullanabilmek istiyorsanız, yardımcınızdaki her iki sürümü de bildirebilirsiniz:

module MyHelper
  def self.html_format(str)
    process(str)
  end

  def html_format(str)
    MyHelper.html_format(str)
  end
end

Bu yardımcı olur umarım!


Teşekkürler ama biraz kafam karıştı. Şu anda benim yardımcım /app/helpers/application_helper.rb ... ... Yardımcıyı ApplicationController'a taşımamı önerir misin?
AnApprentice

Application_controller'a 'include ApplicationHelper' i ekledim ama 'NoMethodError (ApplicationHelper: undefined yöntemi `html_format' 'ile ilgili hatalar:'
AnApprentice 26:11

1
@AnApprentice Anladınız gibi görünüyor, ama cevabımı biraz değiştirdim, umarım işleri daha net hale getiririm. İlk versiyonda, sadece kullanabilirsiniz html_format- sadece MyHelper.html_formatikincisinde ihtiyacınız var .
Xavier Holt

4
Kullanmak istediğiniz yardımcı yöntem gibi görüntüleme yöntemlerini kullandığında bu çalışmaz link_to. Denetleyicilerin bu yöntemlere erişimi yoktur ve yardımcılarımın çoğu bu yöntemleri kullanır. Ayrıca, yardımcıyı denetleyiciye dahil etmek, tüm yardımcıların yöntemlerini, iyi olmayan halka açık eylemler olarak ortaya koyar. view_contextRaylar 3'te gitmek yoludur
GregT

@GregT - Daha sonra grosser'ın cevabını daha önce görmemiştim, çünkü gerçekten biraz sonra geldi, ama ben de daha iyi sevdim. Benim oyumu aldı.
Xavier Holt

304

Kullanabilirsiniz

  • helpers.<helper>içinde Raylar 5 + (ya da ActionController::Base.helpers.<helper>)
  • view_context.<helper>( Ray 4 ve 3 ) (UYARI: arama başına yeni bir görünüm örneği başlatır)
  • @template.<helper>( Raylar 2 )
  • tek bir sınıfta yardımcı ekleyin ve ardından singleton.helper
  • include denetleyicideki yardımcı (UYARI: tüm yardımcı yöntemleri denetleyici eylemlerine dönüştürür)

56
Bu cevap daha da iyi! Ray 3'te basitçe çağrı view_context.helper_functionyapmak basittir ve harika çalışır. ActionController::Base.helpers.helper_functioneşit derecede iyidir.
trisweb

29
view_context= dahi
n_i_c_k

5
UYARI: Kullanmayın view_context. Çağrı başına yeni bir görünüm örneği
başlatacak

7
ActionController::Base.helpers.helper_functionçalışmıyor gibi görünüyor. Bir denetleyici yöntemiyle NoMethodError - undefined method spell_date_and_time' for #<ActionView::Base:0x007fede56102d0>:çağırmaya çalışırken alıyorum ActionController::Base.helpers.spell_date_and_time(). view_context.spell_date_and_time()Ancak arama işe yarıyor.
yayın balığı

37
raylar 5: helpers.helper_functionkontrol cihazınızda kullanın ( github.com/rails/rails/pull/24866 )
Markus

80

Rails 5'te helpers.helper_functionkumandanızda kullanın .

Misal:

def update
  # ...
  redirect_to root_url, notice: "Updated #{helpers.pluralize(count, 'record')}"
end

Kaynak: @Markus'un farklı bir cevaba yaptığı yorumdan. Cevabının en temiz ve kolay çözüm olduğu için kendi cevabını hak ettiğini hissettim.

Referans: https://github.com/rails/rails/pull/24866


6
Konsolda helpertekil olarak ve denetleyicide çoğul olarak çağırmanız biraz garip geliyor .
Yabancı Adam

10

Sorunum Seçenek 1 ile çözüldü. Muhtemelen en basit yol yardımcı modülün kontrolörünüze dahil edilmesidir:

class ApplicationController < ActionController::Base
  include ApplicationHelper

...

1
Yalnızca yardımcı işlevlerin adıyla denetleyici eylemleri eklemesinin dezavantajı. Ama tbh, ben de yaparım :)
Felix

9

Genel olarak, eğer yardımcı (sadece) kontrolörlerde kullanılacaksa, bunu bir örnek yöntemi olarak ilan etmeyi tercih ederim class ApplicationController.


5
Korumalı bir yöntem olarak
Benjamin Crouzier

3

Rails 5+ sürümünde, aşağıdaki gibi basit bir örnekle işlevi kullanabilirsiniz:

module ApplicationHelper
  # format datetime in the format #2018-12-01 12:12 PM
  def datetime_format(datetime = nil)
    if datetime
      datetime.strftime('%Y-%m-%d %H:%M %p')
    else
      'NA'
    end
  end
end

class ExamplesController < ApplicationController
  def index
    current_datetime = helpers.datetime_format DateTime.now
    raise current_datetime.inspect
  end
end

ÇIKTI

"2018-12-10 01:01 AM"

0
class MyController < ApplicationController
    # include your helper
    include MyHelper
    # or Rails helper
    include ActionView::Helpers::NumberHelper

    def my_action
      price = number_to_currency(10000)
    end
end

Rails 5+ içinde sadece yardımcıları kullanın ( helpers.number_to_currency (10000) )

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.