Rails 5 Simpleform 不更新嵌套属性
Rails 5 Simpleform not updating nested attributes
抱歉,我看过类似的问题,但出于某种原因仍然无法弄清楚...
我正在使用 Devise 并尝试使用嵌套表单同时更新我的用户模型和城市模型(通过编辑注册页面)。
我正在根据数据库中的一组预定义值更新用户城市。因此,用户所要做的就是 select 从列表中选择他们居住的城市,然后保存。
目前所发生的只是表单已提交,但城市未更改。
提前致谢!
#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 %>
试试这个:
def user_params
params.require(:user).permit(:city_id)
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 %>
现在一切正常!
抱歉,我看过类似的问题,但出于某种原因仍然无法弄清楚...
我正在使用 Devise 并尝试使用嵌套表单同时更新我的用户模型和城市模型(通过编辑注册页面)。
我正在根据数据库中的一组预定义值更新用户城市。因此,用户所要做的就是 select 从列表中选择他们居住的城市,然后保存。
目前所发生的只是表单已提交,但城市未更改。
提前致谢!
#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 %>
试试这个:
def user_params
params.require(:user).permit(:city_id)
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 %>
现在一切正常!