使用 collection_select 更新 Devise 用户
Use collection_select to update Devise user
我创建了一个语言模型,因此我的 Rails 4 应用上的 Devise 用户可以使用母语更新他们的个人资料。
关系是语言 has_many :users
和用户 belongs_to :language
。
在Devise提供的注册编辑文件中,我添加了要选择的语言,如下所示:
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= devise_error_messages! %>
<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, :autofocus => true, class: "form-control" %>
</div>
<%= collection_select(resource, :language_id, Language.all, :id, :name, :prompt => 'Please select language') %>
<div class="form-group"><%= f.label :email %><br />
<%= f.email_field :email, class: "form-control" %></div>
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end %>
<div class="form-group"><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, autocomplete: "off", class: "form-control" %></div>
<div class="form-group"><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control" %></div>
<div class="form-group"><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password, autocomplete: "off", class: "form-control" %></div>
<div class="form-group"><%= f.submit "Update", class: "btn btn-primary" %></div>
我的 application_controller 文件中也有这个用于设计强参数:
before_filter :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :name
devise_parameter_sanitizer.for(:sign_in) << :email
devise_parameter_sanitizer.for(:account_update) do |u|
u.permit(:name, :email, :language_id, :current_password)
end
end
这显示正确,但实际上并没有用他们选择的语言更新 user.language_id 字段。
我怎样才能得到这个来保存他们的选择?感谢您的帮助。
您需要告诉应用程序您允许通过设计控制器更新其他属性。
假设选择的语言 ID 是在参数[:user][:language_id] 中设置的。您需要执行以下操作;
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) << :language_id
end
end
有关详细信息,请参阅 https://github.com/plataformatec/devise#strong-parameters。
你的强参数似乎没问题。
看起来您的用户模型包含 language_id,因此它只是一个属性,例如姓名、电子邮件等。
你这段语言选择代码,没有连接到表格(见f.collection不见了!)
<%= collection_select(resource, :language_id, Language.all, :id, :name,
:prompt => 'Please select language') %>
Try using this one:
<%= f.select :language_id, Language.all.collect {|u| [u.name, u.id]} %>
If you are using rails 4: (better option)
<%= f.select :language_id, Language.pluck(:name, :id) %>
如果要优先编码准则。 Language.something 将触发数据库查询。因此,尝试将这段代码从视图移动到模型并通过控制器中的实例变量访问。
我创建了一个语言模型,因此我的 Rails 4 应用上的 Devise 用户可以使用母语更新他们的个人资料。
关系是语言 has_many :users
和用户 belongs_to :language
。
在Devise提供的注册编辑文件中,我添加了要选择的语言,如下所示:
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= devise_error_messages! %>
<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, :autofocus => true, class: "form-control" %>
</div>
<%= collection_select(resource, :language_id, Language.all, :id, :name, :prompt => 'Please select language') %>
<div class="form-group"><%= f.label :email %><br />
<%= f.email_field :email, class: "form-control" %></div>
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end %>
<div class="form-group"><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, autocomplete: "off", class: "form-control" %></div>
<div class="form-group"><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control" %></div>
<div class="form-group"><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password, autocomplete: "off", class: "form-control" %></div>
<div class="form-group"><%= f.submit "Update", class: "btn btn-primary" %></div>
我的 application_controller 文件中也有这个用于设计强参数:
before_filter :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :name
devise_parameter_sanitizer.for(:sign_in) << :email
devise_parameter_sanitizer.for(:account_update) do |u|
u.permit(:name, :email, :language_id, :current_password)
end
end
这显示正确,但实际上并没有用他们选择的语言更新 user.language_id 字段。
我怎样才能得到这个来保存他们的选择?感谢您的帮助。
您需要告诉应用程序您允许通过设计控制器更新其他属性。
假设选择的语言 ID 是在参数[:user][:language_id] 中设置的。您需要执行以下操作;
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) << :language_id
end
end
有关详细信息,请参阅 https://github.com/plataformatec/devise#strong-parameters。
你的强参数似乎没问题。 看起来您的用户模型包含 language_id,因此它只是一个属性,例如姓名、电子邮件等。
你这段语言选择代码,没有连接到表格(见f.collection不见了!)
<%= collection_select(resource, :language_id, Language.all, :id, :name,
:prompt => 'Please select language') %>
Try using this one:
<%= f.select :language_id, Language.all.collect {|u| [u.name, u.id]} %>
If you are using rails 4: (better option)
<%= f.select :language_id, Language.pluck(:name, :id) %>
如果要优先编码准则。 Language.something 将触发数据库查询。因此,尝试将这段代码从视图移动到模型并通过控制器中的实例变量访问。