我正在尝试将:name输入字段添加到edit.html.erb表单中,用户在接受设计邀请后将其定向到该表单。
但是,填写表单后:name输入字段为空(不存储在数据库中)。
这是否因为rails 4使用强参数而发生?
我一直在努力解决这个问题一段时间,似乎无处可去。
提前感谢您的帮助!
答案 0 :(得分:4)
在devise_invitable's github repo
上有关于此的维基页面在那篇文章中,他们
Devise::InvitationsController
update
before_action
来更改:accept_invitation
但是,我想知道在ApplicationController
中放入以下内容是否可能(并且更简单):
class ApplicationController < ActionController::Base
#...
before_action :devise_configure_permitted_parameters, if: :devise_controller?
#...
protected
def devise_configure_permitted_parameters
# Devise 3 (deprecated in Devise 4.0 and removed in Devise 4.2)
# devise_parameter_sanitizer.for(:accept_invitation) << :name
# Devise 4
devise_parameter_sanitizer.permit(:accept_invitation, keys: [:name])
end
我已经为设计的:sign_up
和:account_update
行动做了这件事,但它没有覆盖他们的控制器。
答案 1 :(得分:1)
这是我对上述问题的解决方案。
devise_parameter_sanitizer.sanitize(:accept_invitation) do |u|
u.permit(:first_name, :last_name, :invitation_token)
end
就我而言,我允许first_name
和last_name
。最重要的是,允许invitation_token
,否则应用程序将引发错误missing token
。
仅供参考,测试为rails(4.2),设计(3.4.1)和devise_invitable(1.4.1)
答案 2 :(得分:0)
是的,您需要首先允许自定义属性,在您的情况下:名称。在devise git hub repo
中明确提到了这一点答案 3 :(得分:0)
这将适用于Rails 4和5.我在两个版本的RoR上遇到了类似的问题,这就是我解决它的方法。
扩展邀请控制器并向其添加以下代码行:
#controllers/invitations_controllers.rb
class InvitationsController < Devise::InvitationsController
def edit
super
end
private
# add :name to strong params
def update_resource_params
params.require(:devise_model).permit(:email, :password,:password_confirmation, :name, :invitation_token)
end
要扩展默认路线,您需要执行以下操作:
#app/routes.rb
devise_for :devise_models, :controllers => { invitations: 'invitations' }
:devise_model引用与devise关联的模型,而:devise_models引用与devise关联的路由。