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
view_context es tu amigo, http://apidock.com/rails/AbstractController/Rendering/view_context
si quieres compartir métodos entre el controlador y la vista, tienes más opciones:
- use view_context
- defínalo en el controlador y esté disponible a la vista por el método de clase helper_method http://apidock.com/rails/ActionController/Helpers/ClassMethods/helper_method
- definirlo en un módulo compartido e incluir / ampliar