Rails - 更新未选中的复选框时缺少参数(作为 nil 值)
Rails - Params missing when updating unchecked checkboxes (as nil values)
我对表单中的某些复选框有疑问,因为当它们未选中时提交时,我收到错误 param is missing or the value is empty: user
。
我不明白为什么要这样做;在大多数情况下,这个问题是由于没有在隐藏字段中定义空白框而引起的,我已经有了。
值得注意的是,选中某些内容时,复选框可以完美地工作。
这是复选框代码(@user
是标准 User.find(params[:id])
):
<%= form_for(@user) do |f| %>
<h2>Add your dietary requirements:</h2>
<div class="field">
<% hidden_field_tag "user[dietary_requirement_ids][]", nil %> <!-- a lack of this field often seems to generate this problem -->
<% DietaryRequirement.all.each do |dietary_requirement| %>
<%= check_box_tag "user[dietary_requirement_ids][]", dietary_requirement.id, @user.dietary_requirement_ids.include?(dietary_requirement.id), id: dom_id(dietary_requirement) %>
<%= label_tag dom_id(dietary_requirement), dietary_requirement.name %><br>
<% end %>
</div>
<%= f.submit "Update your account", class: "btn btn-primary" %>
<% end %>
检查某些内容时,参数会像这样正确传递:
Parameters: {"user"=>{"dietary_requirement_ids"=>["2"]}, "commit"=>"Update your account", "id"=>"2"}
尽管没有选择任何内容,但他们错误地提交如下:
Parameters: {"commit"=>"Update your account", "id"=>"2"}
令人沮丧的是,到目前为止,这些复选框对我来说效果很好,但今天开始出现错误 - 没有明显的变化应该影响这个。
我仔细看了看,找不到解决我的具体问题的方法 - 有人能帮忙吗?!
谢谢大家,史蒂夫。
编辑
这是来自控制器的参数:
def user_params
params.require(:user).permit(:first_name, :surname, :email, :password, :password_confirmation, :phone, :age, :address, :city, :postcode, :country, { :dietary_requirement_ids => [] })
end
以及编辑/更新操作,以防它们有用:
def edit
@user = User.find(params[:id])
@fridge = @user.fridge
end
def update
@user = User.find(params[:id])
@fridge = @user.fridge
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
redirect_to edit_user_path(@user)
end
end
你告诉你的 params
散列需要一个 :user
但不存在,因此是异常。
两个不是特别好的解决方法:
1. 在调用控制器中的 require
之前,您可以在参数哈希前添加一个空的 :user
:
class UserController < ApplicationController
private
def user_params
params[:user] ||= {}
params.require(:user).permit( .... )
end
end
2. 使用虚拟隐藏属性为您完成此操作。不要忘记将 :dummy
添加到允许的参数列表中。
class User < ActiveRecord::Base
attr_accessor :dummy
end
<%= form_for(@user) do |f| %>
<%= f.hidden_field :dummy, value: 'i am not empty!!!' %>
<% end %>
class UserController < ApplicationController
private
def user_params
params.require(:user).permit(:dummy, ... )
end
end
最终需要进行微小的修改才能解决此问题。隐藏字段中缺少 =
,这意味着它没有加载到 html 中。这是固定的代码,以防将来有人访问。
form_for(@user) do |f| %>
<h2>Add your dietary requirements:</h2>
<div class="field">
<%= hidden_field_tag "user[dietary_requirement_ids][]", nil %>
<% DietaryRequirement.all.each do |dietary_requirement| %>
<%= check_box_tag "user[dietary_requirement_ids][]", dietary_requirement.id, @user.dietary_requirement_ids.include?(dietary_requirement.id), id: dom_id(dietary_requirement) %>
<%= label_tag dom_id(dietary_requirement), dietary_requirement.name %><br>
<% end %>
</div>
<%= f.submit "Update your account", class: "btn btn-primary" %>
<% end %>
您可能认为我会从我对问题的评论中得出这一点。啊好~好到好头!
我对表单中的某些复选框有疑问,因为当它们未选中时提交时,我收到错误 param is missing or the value is empty: user
。
我不明白为什么要这样做;在大多数情况下,这个问题是由于没有在隐藏字段中定义空白框而引起的,我已经有了。
值得注意的是,选中某些内容时,复选框可以完美地工作。
这是复选框代码(@user
是标准 User.find(params[:id])
):
<%= form_for(@user) do |f| %>
<h2>Add your dietary requirements:</h2>
<div class="field">
<% hidden_field_tag "user[dietary_requirement_ids][]", nil %> <!-- a lack of this field often seems to generate this problem -->
<% DietaryRequirement.all.each do |dietary_requirement| %>
<%= check_box_tag "user[dietary_requirement_ids][]", dietary_requirement.id, @user.dietary_requirement_ids.include?(dietary_requirement.id), id: dom_id(dietary_requirement) %>
<%= label_tag dom_id(dietary_requirement), dietary_requirement.name %><br>
<% end %>
</div>
<%= f.submit "Update your account", class: "btn btn-primary" %>
<% end %>
检查某些内容时,参数会像这样正确传递:
Parameters: {"user"=>{"dietary_requirement_ids"=>["2"]}, "commit"=>"Update your account", "id"=>"2"}
尽管没有选择任何内容,但他们错误地提交如下:
Parameters: {"commit"=>"Update your account", "id"=>"2"}
令人沮丧的是,到目前为止,这些复选框对我来说效果很好,但今天开始出现错误 - 没有明显的变化应该影响这个。
我仔细看了看,找不到解决我的具体问题的方法 - 有人能帮忙吗?!
谢谢大家,史蒂夫。
编辑
这是来自控制器的参数:
def user_params
params.require(:user).permit(:first_name, :surname, :email, :password, :password_confirmation, :phone, :age, :address, :city, :postcode, :country, { :dietary_requirement_ids => [] })
end
以及编辑/更新操作,以防它们有用:
def edit
@user = User.find(params[:id])
@fridge = @user.fridge
end
def update
@user = User.find(params[:id])
@fridge = @user.fridge
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
redirect_to edit_user_path(@user)
end
end
你告诉你的 params
散列需要一个 :user
但不存在,因此是异常。
两个不是特别好的解决方法:
1. 在调用控制器中的 require
之前,您可以在参数哈希前添加一个空的 :user
:
class UserController < ApplicationController
private
def user_params
params[:user] ||= {}
params.require(:user).permit( .... )
end
end
2. 使用虚拟隐藏属性为您完成此操作。不要忘记将 :dummy
添加到允许的参数列表中。
class User < ActiveRecord::Base
attr_accessor :dummy
end
<%= form_for(@user) do |f| %>
<%= f.hidden_field :dummy, value: 'i am not empty!!!' %>
<% end %>
class UserController < ApplicationController
private
def user_params
params.require(:user).permit(:dummy, ... )
end
end
最终需要进行微小的修改才能解决此问题。隐藏字段中缺少 =
,这意味着它没有加载到 html 中。这是固定的代码,以防将来有人访问。
form_for(@user) do |f| %>
<h2>Add your dietary requirements:</h2>
<div class="field">
<%= hidden_field_tag "user[dietary_requirement_ids][]", nil %>
<% DietaryRequirement.all.each do |dietary_requirement| %>
<%= check_box_tag "user[dietary_requirement_ids][]", dietary_requirement.id, @user.dietary_requirement_ids.include?(dietary_requirement.id), id: dom_id(dietary_requirement) %>
<%= label_tag dom_id(dietary_requirement), dietary_requirement.name %><br>
<% end %>
</div>
<%= f.submit "Update your account", class: "btn btn-primary" %>
<% end %>
您可能认为我会从我对问题的评论中得出这一点。啊好~好到好头!