2017-04-02 101 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