ruby on rails 4 - app - Rails/Pundit ArgumentError(número incorrecto de argumentos(2 para 0))
railsapps github io (1)
He estado golpeando mi cabeza contra esto por día. Estoy tratando de implementar una política de expertos (utilizando Devise para la autenticación) para un modelo llamado Diseño que pertenece a un Usuario que tiene muchos diseños. ¿Deben crear y nuevas excepciones de autorizar después de la acción también? Parece que esto debería funcionar. Ayuda muy apreciada
Me sigo topando
ArgumentError (número de argumentos incorrecto (2 para 0)):
al crear un nuevo diseño (donde está el ''depurador''). Creo que está pasando un @design válido en el buscador de políticas. Puede ser la forma en que he configurado el alcance en la política.
Aquí está el controlador de diseños:
class DesignsController < ApplicationController
before_filter :authenticate_user!
before_action :set_design, only: [:show, :edit, :update, :destroy]
after_action :verify_authorized, except: [:index, :new]
# GET /designs
# GET /designs.json
def index
@designs = policy_scope(Design)
end
# GET /designs/1
# GET /designs/1.json
def show
end
# GET /designs/new
def new
@design = Design.new
end
# GET /designs/1/edit
def edit
end
# POST /designs
# POST /designs.json
def create
@design = Design.new(design_params)
@design.user_id = current_user.id
respond_to do |format|
if @design.save
format.html { redirect_to @design, notice: ''Design was successfully created.'' }
format.json { render :show, status: :created, location: @design }
else
format.html { render :new }
format.json { render json: @design.errors, status: :unprocessable_entity }
end
end
debugger // This is where it throws the exception
authorize @design
end
# PATCH/PUT /designs/1
# PATCH/PUT /designs/1.json
def update
respond_to do |format|
if @design.update(design_params)
format.html { redirect_to @design, notice: ''Design was successfully updated.'' }
format.json { render :show, status: :ok, location: @design }
else
format.html { render :edit }
format.json { render json: @design.errors, status: :unprocessable_entity }
end
end
end
# DELETE /designs/1
# DELETE /designs/1.json
def destroy
@design.destroy
respond_to do |format|
format.html { redirect_to designs_url, notice: ''Design was successfully destroyed.'' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_design
@design = Design.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def design_params
params.require(:design).permit(:name, :description, :design_model, :certification_for_distribution, :manufacturing_test)
end
end
Aquí está la clase de política de diseños
class DesignPolicy
class Scope<DesignPolicy
attr_reader :user, :scope
def initialize(user,scope)
@user = user
@scope = scope
end
def resolve
if user.admin?
@scope.all
else
@scope.all.where(user_id: user.id)
end
end
end
def index?
debugger
true
end
def new?
debugger
@current_user != nil
end
def create?
@current_user != nil
new?
end
end
- El alcance no debe heredar de DesignPolicy https://github.com/elabs/pundit#scopes
- Necesita configurar DesignPolicy para tener un método de inicialización también https://github.com/elabs/pundit#policies
Si los tiene heredando de ApplicationPolicy, entonces no necesita tener la configuración de métodos de inicialización en cada política. La documentación del experto es excelente, la referencia casi todos los días. Siempre que sepa acerca de las clases y la herencia en Ruby, no debería tener ningún problema.