Rails 5 Simpleform不更新嵌套属性

时间:2017-04-02 12:47:46

标签: ruby-on-rails devise simple-form nested-forms

对不起,我已经看过类似的问题,但由于某些原因仍无法解决......

我正在使用Devise,我正在尝试使用嵌套表单同时更新我的​​用户模型和城市模型(通过编辑注册页面)。

我正在根据数据库中的一组预定义值更新用户城市。所以用户所要做的就是从列表中选择他们居住的城市,然后保存。

此刻发生的一切都是表格提交但城市没有改变。

提前致谢!

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

2 个答案:

答案 0 :(得分:2)

好的,所以我根据冰人的评论和ajerferson的回应来解决我的问题。

(但是嵌套表单无法正常工作的问题仍然存在,但我的问题已修复)

正如冰人所说,Devise在我的应用程序控制器中允许自己的参数。所以我在那里移动了参数(而不是改变我的路线)。

# 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 :(得分:-1)

试试这个:

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