【问题标题】:param is missing or the value is empty?参数丢失或值为空?
【发布时间】:2016-08-05 22:00:42
【问题描述】:
ActionController::ParameterMissing in DuelersController#update
param is missing or the value is empty: dueler

如何修复错误,以便当用户单击“接受”或“拒绝”时,它会更改 :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"}

【问题讨论】:

    标签: ruby-on-rails ruby parameters controller nested-attributes


    【解决方案1】:

    快速修复选项 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 的,然后再转换为参数,以及它们是如何在控制器中处理的。

    【讨论】:

    • Option 3 完美运行:] 感谢您的额外解释!
    【解决方案2】:

    强参数似乎正在放弃“接受”值,因为它没有与“决斗者”相关联。我可能会尝试在视图中放置一个隐藏的复选框,然后通过点击监听器调用一个函数,将复选框设置为适当的值,然后提交表单。

    我不会说这是“正确”的方式,但它可能适用于您的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多