簡體   English   中英

Rails 5 Simpleform不更新嵌套屬性

[英]Rails 5 Simpleform not updating nested attributes

抱歉,我已經看過類似的問題,但由於某些原因仍無法解決...

我正在使用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 %>

好的,所以我根據Iceman的評論和ajerferson的答復來解決問題。

(但是仍然存在嵌套表單無法使用的問題,但我的問題已修復)

正如Iceman所說,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 %>

現在可以正常使用了!

試試看:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM