参数缺失或值为空?
param is missing or the value is empty?
ActionController::ParameterMissing in DuelersController#update
param is missing or the value is empty: dueler
如何修复错误以便当用户单击 "Accept" 或 "Decline" 时它会更改 :accept
的值
Dueler.last
id: 20,
user_id: 78,
challenge_id: 178,
duel_id: 13,
accept: nil>
形式
<%= form_for @dueler do |f| %>
<%= f.button "Accept", name: "button_action", value: "accept" %>
<%= f.button "Decline", name: "button_action", value: "decline" %>
<% end %>
duelers_controller.rb
def update
if params['button_action'] == 'accept'
@dueler.accept = 1
else
@dueler.accept = 0
end
@dueler.update(dueler_params)
redirect_to :back
end
def dueler_params
params.require(:dueler).permit(:id, :duel_id, :user_id, :challenge_id, :accept)
end
终端机
Processing by DuelersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"zn6Z9XuCQ2JahhtrZzFpEl3ENe+bcmOdDH/gz6VZ4p0mnRvgwpixdF2uA/sFgaQZFu2dEKR0DivQpJLqu96pxg==", "button_action"=>"accept", "id"=>"15"}
这是我使用 :accept
作为 check_mark
提交时参数的样子,它不会引发任何错误:
Processing by DuelersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"KWDac1I2rNRZd6oeCan0F7qlNY4c5K5vd6U988MJ6n3Bg1hm6yxewl5fso5rGTkc8YydcSPiw9mrfk/W3Y6hJg==", "dueler"=>{"accept"=>"1"}, "commit"=>"Update Dueler", "id"=>"15"}
强参数似乎正在删除 "accept" 值,因为它没有与 "dueler" 相关联。我可能会尝试在视图中放置一个隐藏的复选框,然后通过点击侦听器调用一个函数,将复选框设置为适当的值,然后提交表单。
我不会说这是 "right" 方式,但它可能适合您的情况。
快速修复选项 1:
<%= form_for @dueler do |f| %>
<%= f.button "Accept", name: "dueler[button_action]", value: "accept" %>
<%= f.button "Decline", name: "dueler[button_action]", value: "decline" %>
<% end %>
快速修复选项 2:
def dueler_params
params.permit(:id, :duel_id, :user_id, :challenge_id, :button_action)
end
选项 3 - 更大的变化,但我最喜欢它
形式
<%= form_for @dueler do |f| %>
<%= f.button "Accept", name: "dueler[accept]", value: 1 %>
<%= f.button "Decline", name: "dueler[accept]", value: 0 %>
<% end %>
duelers_controller.rb
def update
@dueler.update(dueler_params.merge(accept: dueler_params[:accept].to_i))
redirect_to :back
end
这两种选择都应该能让您克服这个特定的错误。但是,我担心您没有完全理解您的代码片段是如何协同工作的。我希望您的控制器的下一部分的行为与您预期的不同:
if params['button_action'] == 'accept'
@dueler.accept = 1
else
@dueler.accept = 0 # "accept" sounds like a Boolean piece of data to me, but it looks like you're saving it as an integer
end
@dueler.update(dueler_params) # I expect you'll get "undefined method `button_action=' for #<Dueler:0x007fc4fac732d0>" here
你可能想多玩玩 form_for
和强参数来理解你传递给 button
的参数是如何变成 HTML,然后变成参数的,以及它们在控制器中的处理方式。
ActionController::ParameterMissing in DuelersController#update
param is missing or the value is empty: dueler
如何修复错误以便当用户单击 "Accept" 或 "Decline" 时它会更改 :accept
Dueler.last
id: 20,
user_id: 78,
challenge_id: 178,
duel_id: 13,
accept: nil>
形式
<%= form_for @dueler do |f| %>
<%= f.button "Accept", name: "button_action", value: "accept" %>
<%= f.button "Decline", name: "button_action", value: "decline" %>
<% end %>
duelers_controller.rb
def update
if params['button_action'] == 'accept'
@dueler.accept = 1
else
@dueler.accept = 0
end
@dueler.update(dueler_params)
redirect_to :back
end
def dueler_params
params.require(:dueler).permit(:id, :duel_id, :user_id, :challenge_id, :accept)
end
终端机
Processing by DuelersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"zn6Z9XuCQ2JahhtrZzFpEl3ENe+bcmOdDH/gz6VZ4p0mnRvgwpixdF2uA/sFgaQZFu2dEKR0DivQpJLqu96pxg==", "button_action"=>"accept", "id"=>"15"}
这是我使用 :accept
作为 check_mark
提交时参数的样子,它不会引发任何错误:
Processing by DuelersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"KWDac1I2rNRZd6oeCan0F7qlNY4c5K5vd6U988MJ6n3Bg1hm6yxewl5fso5rGTkc8YydcSPiw9mrfk/W3Y6hJg==", "dueler"=>{"accept"=>"1"}, "commit"=>"Update Dueler", "id"=>"15"}
强参数似乎正在删除 "accept" 值,因为它没有与 "dueler" 相关联。我可能会尝试在视图中放置一个隐藏的复选框,然后通过点击侦听器调用一个函数,将复选框设置为适当的值,然后提交表单。
我不会说这是 "right" 方式,但它可能适合您的情况。
快速修复选项 1:
<%= form_for @dueler do |f| %>
<%= f.button "Accept", name: "dueler[button_action]", value: "accept" %>
<%= f.button "Decline", name: "dueler[button_action]", value: "decline" %>
<% end %>
快速修复选项 2:
def dueler_params
params.permit(:id, :duel_id, :user_id, :challenge_id, :button_action)
end
选项 3 - 更大的变化,但我最喜欢它
形式
<%= form_for @dueler do |f| %>
<%= f.button "Accept", name: "dueler[accept]", value: 1 %>
<%= f.button "Decline", name: "dueler[accept]", value: 0 %>
<% end %>
duelers_controller.rb
def update
@dueler.update(dueler_params.merge(accept: dueler_params[:accept].to_i))
redirect_to :back
end
这两种选择都应该能让您克服这个特定的错误。但是,我担心您没有完全理解您的代码片段是如何协同工作的。我希望您的控制器的下一部分的行为与您预期的不同:
if params['button_action'] == 'accept'
@dueler.accept = 1
else
@dueler.accept = 0 # "accept" sounds like a Boolean piece of data to me, but it looks like you're saving it as an integer
end
@dueler.update(dueler_params) # I expect you'll get "undefined method `button_action=' for #<Dueler:0x007fc4fac732d0>" here
你可能想多玩玩 form_for
和强参数来理解你传递给 button
的参数是如何变成 HTML,然后变成参数的,以及它们在控制器中的处理方式。