使用 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 将触发数据库查询。因此,尝试将这段代码从视图移动到模型并通过控制器中的实例变量访问。