2015-01-16 28 views
0

我創建了一個語言模型,以便讓我的Rails 4應用程序上的用戶可以使用本地語言更新其配置文件。使用collection_select更新Devise用戶

這些關係是語言has_many :users和用戶belongs_to :language

在由設計所提供的註冊編輯文件,我說要選擇的語言,像這樣:

<%= 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> 

我也有這個在制定強有力的PARAMS我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字段。

我怎樣才能得到這個保存他們的選擇?謝謝您的幫助。

+0

請粘貼完整的表格! – Ajay

+0

對不起,我現在加入:) – user1573016

回答

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將會觸發數據庫查詢。因此,請嘗試將這段代碼從視圖移到控制器中的實例變量的&訪問。

+0

如果這解決了您的問題,請接受答案。 – Ajay

+0

感謝您的解釋和解決方案!那就是訣竅。 – user1573016

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

+0

感謝您的輸入!我忘了提及我已經這樣做了。我更新了問題以顯示它。 – user1573016