rails app ruby-on-rails-4 devise pundit

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


  1. El alcance no debe heredar de DesignPolicy https://github.com/elabs/pundit#scopes
  2. 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.