2017-04-02 100 views
0

對不起,我已經看了類似的問題這一點,但仍然無法弄清楚出於某種原因...Rails的5 Simpleform沒有更新嵌套屬性

我使用的設計,我試圖更新我的用戶模型和City模型(通過編輯註冊頁面)使用嵌套表單。

我正在基於數據庫中的一組預定義值更新用戶城市。所以用戶所要做的就是從列表中選擇一個城市,然後保存。

現在發生的所有事情都是表單提交,但城市沒有改變。

在此先感謝!

#user.rb 
class User < ApplicationRecord 
    belongs_to :city 
end 

#city.rb 
class City < ApplicationRecord 
    has_many :users 
end 

我的控制器:

class UsersController < ApplicationController 
    def index 
    @users = User.all 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 

    if @user.update(user_params) 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 

    private 

    def user_params 
    params.require(:user).permit(city_attributes: [:id, :name, :user_id]) 
    end 
end 

我的形式:

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> 

     <%= f.simple_fields_for :city do |c| %> 

     <%= c.input :city_id, collection: City.all.order(name: :asc), label_method: :name, value_method: :id, label: "City", include_blank: false, selected: @user.city_id %> 

     <% end %> 
<% end %> 
+0

我的猜測是,它不起作用,因爲表單不會回發給你的users_controller。您必須以特定方式覆蓋'routes.rb'文件,以告訴Devise使用您的控制器。 – Iceman

+1

謝謝@Iceman。我現在在下面發佈我的答案,我的問題已排序。嵌套屬性仍然不起作用,但這是我回到另一個時間。 –

+0

很高興你的工作,也許我會考慮在其他問題的某個時候。 – Iceman

回答

2

好了,所以我出來整理我的問題基礎上的評論來自冰人和來自ajerfer的迴應兒子。

(但問題是,嵌套表格不工作仍然存在,但我的問題是固定的)

隨着冰人說設計是在我的應用程序控制器,允許自己的參數。所以我移動了參數(而不是改變我的路線)。

# application_controller.rb 
def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name]) 
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :date_of_birth, :gender, city_attributes: [:id, :name, :user_id]]) 
    end 

我再次嘗試,但同樣的問題發生。因此,我所做竟是報廢嵌套形式和簡單地改變我的應用程序控制器,這和靶向的city_id外鍵:

def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name]) 
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :date_of_birth, :gender, :city_id]) 
    end 

我的形式:

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> 

    <%= f.input :city_id, collection: City.all.order(name: :asc), label: "City" %> 

<%= f.button :submit, "Save" %> 
<% end %> 

和現在的作品完美的罰款!

-1

嘗試了這一點:

def user_params 
    params.require(:user).permit(:city_id) 
end