我创建了一个语言模型,因此我的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字段。
如何保存他们的选择呢?谢谢你的帮助。
答案 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。