我正在使用Devise。当用户发送邀请并且接收用户填写了他们的:first_name
和:last_name
字段时,我会在日志中收到此消息:
Started PUT "/users/invitation" for 127.0.0.1 at 2015-02-25 14:10:06 -0500
Processing by Users::InvitationsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"CfMhjBwFUc=", "user"=>{"invitation_token"=>"U9M", "first_name"=>"Jenny", "last_name"=>"Block", "invitation_relation"=>"grandmother", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Set my password"}
Unpermitted parameters: first_name, last_name
User Load (2.5ms) SELECT "users".* FROM "users" WHERE "users"."invitation_token" = '315bb1140e' ORDER BY "users"."id" ASC LIMIT 1
User Load (1.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
FamilyTree Load (1.4ms) SELECT "family_trees".* FROM "family_trees" WHERE "family_trees"."user_id" = $1 LIMIT 1 [["user_id", 1]]
Unpermitted parameters: first_name, last_name
Relly is
Unpermitted parameters: first_name, last_name
(1.1ms) BEGIN
SQL (2.1ms) INSERT INTO "memberships" ("created_at", "family_tree_id", "updated_at", "user_id") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", "2015-02-25 19:10:07.046926"], ["family_tree_id", 1], ["updated_at", "2015-02-25 19:10:07.046926"], ["user_id", 11]]
(1.8ms) COMMIT
Unpermitted parameters: first_name, last_name
(1.1ms) BEGIN
SQL (1.6ms) UPDATE "users" SET "encrypted_password" = $1, "updated_at" = $2 WHERE "users"."id" = 11 [["encrypted_password", "$2a$10$SDZ.hJ3O2UzAPz64lgwFrO/ZZOFkc03yF9FvywpLQA/JV827ZHOeO"], ["updated_at", "2015-02-25 19:10:07.138950"]]
(1.5ms) COMMIT
Unpermitted parameters: first_name, last_name
User Load (1.8ms) SELECT "users".* FROM "users" WHERE "users"."invitation_token" = '315bb11408368891d2b06e502cfe5f5c6493829860d23add6743da7eec660a57' ORDER BY "users"."id" ASC LIMIT 1
(1.2ms) BEGIN
SQL (1.5ms) UPDATE "users" SET "confirmed_at" = $1, "encrypted_password" = $2, "invitation_accepted_at" = $3, "invitation_token" = $4, "updated_at" = $5 WHERE "users"."id" = 11 [["confirmed_at", "2015-02-25 19:10:07.231371"], ["encrypted_password", "$2a$10$nsM6Ml.ruXnPF7vi9"], ["invitation_accepted_at", "2015-02-25 19:10:07.231371"], ["invitation_token", nil], ["updated_at", "2015-02-25 19:10:07.233262"]]
(1.3ms) COMMIT
FamilyTree Load (1.4ms) SELECT "family_trees".* FROM "family_trees" WHERE "family_trees"."user_id" = $1 LIMIT 1 [["user_id", 11]]
User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
(1.2ms) BEGIN
SQL (1.3ms) INSERT INTO "memberships" ("created_at", "family_tree_id", "relation", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["created_at", "2015-02-25 19:10:07.245419"], ["family_tree_id", 11], ["relation", "grandmother"], ["updated_at", "2015-02-25 19:10:07.245419"], ["user_id", 1]]
(1.4ms) COMMIT
(1.2ms) BEGIN
SQL (1.4ms) UPDATE "users" SET "current_sign_in_at" = $1, "current_sign_in_ip" = $2, "last_sign_in_at" = $3, "last_sign_in_ip" = $4, "sign_in_count" = $5, "updated_at" = $6 WHERE "users"."id" = 11 [["current_sign_in_at", "2015-02-25 19:10:07.250211"], ["current_sign_in_ip", "127.0.0.1"], ["last_sign_in_at", "2015-02-25 19:10:07.250211"], ["last_sign_in_ip", "127.0.0.1"], ["sign_in_count", 1], ["updated_at", "2015-02-25 19:10:07.252735"]]
(1.3ms) COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 268ms (ActiveRecord: 31.3ms)
请注意整个请求中的所有内容,只要需要这些属性,由于Unpermitted parameters
,它就无效。
然而,在我的UsersController.rb
中,我有这个:
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :avatar)
end
在User.rb
我有:
attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :invitation_relation ,:remember_me, :avatar
我没有独立的邀请控制器,不确定是否重要。
请注意,当我从另一个控制器(例如Registrations#Update
)更新用户记录时,它可以正常工作,如此日志中所示:
Started PUT "/users" for 127.0.0.1 at 2015-02-25 14:19:58 -0500
Processing by RegistrationsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"CfMhjFUc=", "user"=>{"email"=>"jenny@test.com", "first_name"=>"Jenny", "last_name"=>"Block", "current_password"=>"[FILTERED]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Update"}
User Load (2.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 11 ORDER BY "users"."id" ASC LIMIT 1
FamilyTree Load (3.0ms) SELECT "family_trees".* FROM "family_trees" WHERE "family_trees"."user_id" = $1 LIMIT 1 [["user_id", 11]]
User Load (1.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 11]]
(2.0ms) BEGIN
SQL (1.7ms) UPDATE "users" SET "first_name" = $1, "last_name" = $2, "updated_at" = $3 WHERE "users"."id" = 11 [["first_name", "Jenny"], ["last_name", "Block"], ["updated_at", "2015-02-25 19:19:58.716236"]]
(1.8ms) COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 92ms (ActiveRecord: 41.7ms)
可能导致这种奇怪行为的原因是什么?
修改1
这就是我ApplicationsController
的样子:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_filter :configure_permitted_parameters, if: :devise_controller?
before_filter :update_sanitized_params, if: :devise_controller?
protected
def update_sanitized_params
devise_parameter_sanitizer.for(:sign_up) {|u| u.permit( :first_name, :last_name, :email, :password, :password_confirmation)}
end
def configure_permitted_parameters
# Only add some parameters
devise_parameter_sanitizer.for(:invite) do |u|
u.permit :first_name, :last_name, :email, :invitation_relation
end
devise_parameter_sanitizer.for(:accept_invitation) do |u|
u.permit :invitation_token, :first_name, :last_name, :relation
end
devise_parameter_sanitizer.for(:account_update) do |u|
u.permit(:first_name, :last_name, :avatar, :email, :password, :password_confirmation)
end
devise_parameter_sanitizer.for(:accept_invitation).concat [:first_name, :last_name, :email, :invitation_relation]
# Override accepted parameters
devise_parameter_sanitizer.for(:accept_invitation) do |u|
u.permit(:first_name, :last_name, :email, :invitation_relation)
end
end
end
答案 0 :(得分:0)
如果你查看Devise文档,它会说RegistrationController
允许身份验证密钥和密码。您可以通过添加
first_name
和last_name
个参数
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :first_name #or whatever param you need
end
end
您可以看到文档here
答案 1 :(得分:0)
我创建了一个独立的invitations_controller
,我将其添加到它的底部:
def update_sanitized_params
devise_parameter_sanitizer.for(:accept_invitation) do |u|
u.permit(:first_name, :last_name, :password, :password_confirmation, :invitation_token, :invitation_relation,:avatar, :avatar_cache, :relation, :gender)
end
end
这似乎解决了它。