无法使用devise和devise_invitable注册用户未许可参数错误

时间:2013-10-02 22:06:28

标签: ruby-on-rails devise devise-invitable

我在Rails3.2 devise_invitable(1.1.8),设计(3.1.1)没有强参数,当我尝试注册用户时,我得到了跟踪日志。我正在使用此路由来自定义设计邀请控制器:

devise_for :users, path_names: {sign_in: "login", sign_out: "logout"}, :controllers => { :invitations => 'team_invitations' }

但是为什么注册请求发送到DeviseInvitable :: RegistrationsController而不是设计注册控制器

Started POST "/users" for 127.0.0.1 at 2013-10-02 21:27:50 +1300
Processing by DeviseInvitable::RegistrationsController#create as HTML
Parameters: {"utf8"=>"✓","authenticity_token"=>"thlkjyVYHhFY3erB+9yI7uwotIU7GozswOdjz9w7DNA=", 
"user"=>{"username"=>"", "email"=>"boopage@gmail.com", "password"=>"[FILTERED]"}, "commit"=>"Sign up"}
Unpermitted parameters: username, email, password

由于

4 个答案:

答案 0 :(得分:2)

这已经过时了,我更确定上面提供的解决方案都没有工作(因为,我遇到了同样的问题)。

将控制器扩展为invitable,并向其添加以下代码行:

#app/controllers/invitations_controllers.rb
class InvitationsController < Devise::InvitationsController
def edit
   super
end

private
def update_resource_params
    params.require(:user).permit(:email, :password, :password_confirmation, :your_params, :invitation_token)
end

要扩展控制器,您需要创建以下内容:

#app/routes.rb
devise_for :users, :controllers => { invitations: 'invitations' }

瞧!

答案 1 :(得分:1)

您需要在应用程序控制器中编辑强参数:这将有助于https://github.com/scambra/devise_invitable#strong-parameters

devise_parameter_sanitizer.for(:invite) do |u|
   u.permit(username, :email, :password, :password_confirmation,
         :invitation_token)
end

答案 2 :(得分:0)

在controllers / application_controller.rb中添加:

before_filter :configure_permitted_parameters, if: :devise_controller?

protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_in) << :username
    devise_parameter_sanitizer.for(:sign_in) << :email
    devise_parameter_sanitizer.for(:sign_in) << :password
  end

答案 3 :(得分:0)

有同样的问题,以上解决方案对我不起作用。所以我对设计模块(源https://github.com/scambra/devise_invitable/blob/a50e37bc43509f7be02be8bca2b072b55e66eeaf/lib/devise_invitable/parameter_sanitizer.rb)进行了一些小修补:

module DeviseInvitable
  module ParameterSanitizer
    CUSTOM_FIELDS = [:field1, :field2]

    private

    if defined?(Devise::BaseSanitizer)
      def permit(keys)
        default_params.permit(*Array(keys))
      end

      def attributes_for_with_invitable(kind)
        case kind
        when :invite
          resource_class.respond_to?(:invite_key_fields) ? resource_class.invite_key_fields.concat(CUSTOM_FIELDS) : []
        when :accept_invitation
          [:password, :password_confirmation, :invitation_token]
        else attributes_for_without_invitable(kind)
        end
      end
    else
      def initialize_with_invitable(resource_class, resource_name, params)
        initialize_without_invitable(resource_class, resource_name, params)
        permit(:invite, keys: (resource_class.respond_to?(:invite_key_fields) ? resource_class.invite_key_fields.concat(CUSTOM_FIELDS) : []) )
        permit(:accept_invitation, keys: [:password, :password_confirmation, :invitation_token] )
      end
    end
  end
end

只需将其放置到初始化程序即可。