使用collection_select更新Devise用户

时间:2015-01-16 06:40:00

标签: ruby-on-rails devise

我创建了一个语言模型,因此我的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文件中也有这个用于Devise强参数:

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字段。

如何保存他们的选择呢?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

你的强大参数似乎很好。 它看起来你的用户模型拥有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将触发数据库查询。所以尝试将这段代码从View转移到Model&amp;通过控制器中的实例变量进行访问。

答案 1 :(得分:0)

您需要告诉应用程序您允许通过设计控制器更新其他属性。

假设所选语言ID在params [: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