Cancan, problemas con new en un controlador. ArgumentError - wrong number of arguments (given 1, expected 0)

28 views
Skip to first unread message

josedes

unread,
Sep 5, 2017, 3:40:17 PM9/5/17
to rubysur
Hola amigos, necesito de su ayuda

Tengo el siguiente problema:

Estoy usando Cancancan, pero cuando llamo a la acción de index funciona bien, pero cuando intento llamar a new, me muestra:

Completed 500 Internal Server Error in 10ms (ActiveRecord: 1.2ms)

ArgumentError - wrong number of arguments (given 1, expected 0):
  actionpack (4.2.1) lib/action_controller/metal.rb:131:in `initialize'
  actionpack (4.2.1) lib/action_dispatch/routing/url_for.rb:104:in `initialize'
  actionview (4.2.1) lib/action_view/layouts.rb:355:in `initialize'
  cancancan (2.0.0) lib/cancan/controller_resource.rb:80:in `new'

No entiendo que sucede, alguien me puede ayudar

**Este es mi applicationController.rb**

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead. 
 
  protect_from_forgery with: :exception
  include CodigosGenerales
  before_action :cargarOpcionesDelPrincipal
  layout :colocar_layout
  helper_method :resource, :resource_name, :devise_mapping
 
  before_filter do
    resource = controller_path.singularize.gsub('/', '_').to_sym
    method = "#{resource}_params"
    params[resource] &&= send(method) if respond_to?(method, true)
  end

  rescue_from CanCan::AccessDenied do |exception|
      respond_to do |format|
        format.json { head :forbidden, content_type: 'text/html' }
        format.html { redirect_to root_path, alert: 'No tiene autorización para acceder' }
        format.js   { head :forbidden, content_type: 'text/html' }
    end
  end

  def current_ability
    controller_name_segments = params[:controller].split('/')
    controller_name_segments.pop
    controller_namespace = controller_name_segments.join('/').camelize
    Ability.new(current_usuario, controller_namespace)
    #Ability.new(current_usuario)
  end
 
 def resource_name
    :usuario
  end

  def resource
    @resource ||= Usuario.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:usuario]
  end

private

 def after_sign_out_path_for(resource_or_scope)
    new_usuario_session_path
end

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
   
    devise_parameter_sanitizer.permit(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
   
    devise_parameter_sanitizer.permit(:account_update) {
                |u| u.permit(:nombre,
                             :apellido,
                             :email,
                             :password,
                             :password_confirmation,
                             :current_password,
                             :cedula,
                             :numero_excel,
                             :historia,
                             :estado,
                             :apellido,
                             :telefono_habitacion,
                             :telefono_trabajo,
                             :celular1,
                             :celular2,
                             :email2,
                             :fecha_nacimiento,
                             :ava,
                             :hong,
                             :berm,
                             :john,
                             :asp,
                             :blom,
                             :rol  ) }
  end
end

**este es mi archivo model/ability.rb**

class Ability
  include CanCan::Ability

  def initialize(user, controller_namespace) 
    user ||= Usuario.new # guest user (not logged in)
    can :manage, :welcome_con

    case controller_namespace
      when "Administrator"
        if user.rol == 1
            can :manage, Administrator::FaqsController
            can :manage, Administrator::TipsController
       end
        if user.rol == 2
            can :manage, :admin_vacunas
            can :manage, Administrator::ConfigurationsController
            can :manage, Administrator::ContactosController
            can :manage, Administrator::HomeTratamientoController
            can :manage, Administrator::VacunasController
        end
 
      when "paciente"
        if user.rol == 3
            can :manage, Paciente::HomeController
        end
      else 
            can :read, :all
     end
  end
end

**Y este es mi controlador:**

class Administrator::FaqsController < ApplicationController
include CodigosGenerales
 before_filter :authenticate_usuario!
  before_action :cargarOpcionesDelPrincipal
 load_and_authorize_resource :class => Administrator::FaqsController
 layout "administrator"

  def index
       @faqs = Faq.all.order('created_at desc')
     if @faqs.empty?
       flash.now[:warning] = "Aún no se han creado preguntas y respuestas"
     end
  end

  def show
    @faq = Faq.find(params[:id])
  end

  def new
    @faq = Faq.new
  end

  def edit
    @faq = Faq.find( params[:id] )
  end

  def create
    @faq = Faq.new(faq_params)
    @faq.usuario_id = current_usuario.id
    respond_to do |format|
      if @faq.save
        format.html { redirect_to administrator_faq_path(@faq), notice: 'La pregunta fue creada exitosamente' }
        format.json { render :show, status: :created, location: @faq }
      else
        format.html { render :new }
        format.json { render json: @faq.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    @faq = Faq.find params[:id]
    @faq.usuario_id = current_usuario.id
    respond_to do |format|
      if @faq.update(faq_params)
        format.html {redirect_to administrator_faq_path(@faq), notice: 'La pregunta fue modificada exitosamente' }
        format.json { render :show, status: :ok, location: @faq }
      else
        format.html { render :edit }
        format.json { render json: @faq.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @faq = Faq.find params[:id]
    @faq.destroy
    respond_to do |format|
      format.html { redirect_to administrator_faqs_path(@faq), notice: 'La pregunta fue eliminada exitosamente.' }
      format.json { head :no_content }
    end
  end

  private
    def set_faq
      @faq = Faq.find(params[:id])
    end

     def faq_params
      params.require(:faq).permit(:pregunta, :respuesta)
  end
end


Juan Angel Szymczak

unread,
Sep 5, 2017, 6:02:54 PM9/5/17
to rub...@googlegroups.com
Buenas, si es lo primero a lo que agregas roles y permisos, te aconsejo volver atrás y cambiar por CanCanCan por Pundit.
Tiene una dsl más transparente, su integración es más sencilla y menos invasiva.

Saludos
Juan

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
Angel Szymczak
Engineer and Software Developer

Jose De Sousa

unread,
Sep 5, 2017, 6:39:09 PM9/5/17
to rubysur
Hola Juan,

Gracias por responder, no es lo primero por que lo que me parece rarisimo que este comportandose de esa manera y me gustaría resolverlo vía cancan, pero voy a revisar Pundit de todas maneras.

Gracias saludos


Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
Angel Szymczak
Engineer and Software Developer

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
OtusNet ©
Soluciones inteligentes
@ sus necesidades en Internet
Joselito De Sousa
(058)-04142384634

Emanuel Friedrich

unread,
Sep 5, 2017, 6:52:40 PM9/5/17
to rub...@googlegroups.com
Hola José, nunca usé CanCan pero me tomé la molestia de ver el repo

https://github.com/ryanb/cancan/blob/master/lib/cancan/controller_resource.rb

load_and_authorize_resource no recibe argumentos

En tu caso veo

load_and_authorize_resource :class => Administrator::FaqsController

además que hacés referencia con :class al controller actual, quizá sea redundante igualmente, si no es este el problema.

Disculpá si no es el error, pero eso me llamó la atención.


Emanuel Friedrich 

Cel: 3754-442896

Jose De Sousa

unread,
Sep 5, 2017, 7:12:49 PM9/5/17
to rubysur
Hola Emanuel

Tu siempre pendiente de ofrecer ayuda, se agradece de antemano.

Gracias a tu respuesta lo resolví.

Si es cierto no tiene parámetro, eso lo coloque por que el controlador lo tengo en un namespace (administrator) pero el modelo no, y buscando encontre esto:

https://github.com/ryanb/cancan/issues/416

Seguramente en esta versión de cancancan no puedo realizar eso, lo raro es que funciona con index pero no con new, de echo si no lo coloco me da error y si en ability.rb dejo:
 
can :manage, Administrator::Faq

No funciona, muestra:

NameError - uninitialized constant Administrator::Faq

pero cambie por:

 can :manage, Faq

Y FUNCIONA

Ahora realmente quiero entender por que funciona así

Gracias amigo



José De Sousa
584142384634
Reply all
Reply to author
Forward
0 new messages