rutas restful rails formularios crear controlador ruby-on-rails helper helpers applicationcontroller

ruby-on-rails - restful - rutas en ruby on rails



"Método indefinido" al llamar al método auxiliar desde el controlador en Rails (11)

Como dijo gamecreature en esta publicación :

  • En Rails 2 usa la variable @template .
  • En Rails 3 use el método del controlador view_context

¿Alguien sabe por qué me dan

undefined method `my_method'' for #<MyController:0x1043a7410>

cuando llamo my_method ("cadena") desde dentro de mi subclase ApplicationController? Mi controlador parece

class MyController < ApplicationController def show @value = my_method(params[:string]) end end

y mi ayudante

module ApplicationHelper def my_method(string) return string end end

y finalmente, ApplicationController

class ApplicationController < ActionController::Base after_filter :set_content_type helper :all helper_method :current_user_session, :current_user filter_parameter_logging :password protect_from_forgery # See ActionController::RequestForgeryProtection for details


Incluya ApplicationHelper en el archivo application_controller.rb como este:

class ApplicationController < ActionController::Base protect_from_forgery include ApplicationHelper end

De esta forma, todos los métodos definidos en el archivo application_helper.rb estarán disponibles en el controlador.

También puede incluir ayudantes individuales en controladores individuales.


Intente module_function(*instance_methods) en sus módulos auxiliares, después de lo cual puede llamar directamente a esos métodos en el módulo mismo.


Intente acceder a la función auxiliar directamente desde sus controladores view_context.helper_name


No puedes llamar a los ayudantes desde los controladores. Su mejor opción es crear el método en ApplicationController si necesita ser utilizado en múltiples controladores.

EDITAR : para ser claros, creo que gran parte de la confusión (corrígeme si me equivoco) proviene de la helper :all llaman. helper :all realmente solo incluyen todos sus ayudantes para su uso bajo cualquier control en el lado de la vista. En versiones mucho más antiguas de Rails, el espacio de nombres de los ayudantes determinaba qué vistas de los controladores podían usar los ayudantes.

Espero que esto ayude.


Por lo que sé, helper :all hace que los ayudantes estén disponibles en las vistas ...


Tal vez estoy equivocado, pero ¿no son los ayudantes solo por los puntos de vista? Por lo general, si necesita una función en un controlador, la pone en ApplicationController ya que cada función está disponible en sus clases de niños.


Yo tuve el mismo problema...

puedes hackear / burlarlo, poner esa lógica en un modelo o crear una clase especialmente para ello. Los modelos son accesibles para los controladores, a diferencia de esos molestos métodos de ayuda.

Aquí está mi modelo "rag.rb"

class Rag < ActiveRecord::Base belongs_to :report def miaow() cat = "catattack" end end

Aquí es parte de mi controlador "rags_controller.rb"

def update @rag = Rag.find(params[:id]) puts @rag.miaow() ...

Esto dio un catattack en la terminal, después de hacer clic en "actualizar".

Dada una instanciación, se pueden llamar los métodos en el modelo. Reemplaza catattack con algunos códigos. (Esto es lo mejor que tengo hasta ahora)

: helper all solo abre helpers hasta views.

Esto muestra cómo hacer una clase y llamarla. http://railscasts.com/episodes/101-refactoring-out-helper-object?autoplay=true


aunque no es una buena práctica llamar a ayudantes en el controlador, ya que los helpers deben usarse en las vistas, la mejor manera de usar los helpers en el controlador es hacer un método de ayuda en application_controller y llamarlos al controlador,
pero incluso si se requiere llamar al ayudante en un controlador
entonces solo incluye el ayudante en el controlador

class ControllerName < ApplicationController include HelperName ...callback statements..

y llama a los métodos de ayuda directamente al controlador

module OffersHelper def generate_qr_code(text) require ''barby'' require ''barby/barcode'' require ''barby/barcode/qr_code'' require ''barby/outputter/png_outputter'' barcode = Barby::QrCode.new(text, level: :q, size: 5) base64_output = Base64.encode64(barcode.to_png({ xdim: 5 })) "data:image/png;base64,#{base64_output}" end

Controlador

class ControllerName < ApplicationController include OffersHelper def new generate_qr_code(''Example Text'') end end

espero que esto ayude !


los helpers son para vistas, pero agregar una línea de código para incluir ese archivo auxiliar en ApplicationController.rb puede encargarse de su problema. en su caso, inserte la siguiente línea en ApplicationController.rb:

include ApplicationHelper