简体   繁体   中英

param is missing or the value is empty?

ActionController::ParameterMissing in DuelersController#update
param is missing or the value is empty: dueler

How can I fix the error so that when a user clicks "Accept" or "Decline" it will change the value of :accept

Dueler.last
 id: 20,
 user_id: 78,
 challenge_id: 178,
 duel_id: 13,
 accept: nil>

form

<%= 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

terminal

Processing by DuelersController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"zn6Z9XuCQ2JahhtrZzFpEl3ENe+bcmOdDH/gz6VZ4p0mnRvgwpixdF2uA/sFgaQZFu2dEKR0DivQpJLqu96pxg==", "button_action"=>"accept", "id"=>"15"}

This is how the parameters look like when I submit with :accept as a check_mark , which doesn't raise any error:

Processing by DuelersController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"KWDac1I2rNRZd6oeCan0F7qlNY4c5K5vd6U988MJ6n3Bg1hm6yxewl5fso5rGTkc8YydcSPiw9mrfk/W3Y6hJg==", "dueler"=>{"accept"=>"1"}, "commit"=>"Update Dueler", "id"=>"15"}

Quick fix option 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 %>

Quick fix option 2:

def dueler_params params.permit(:id, :duel_id, :user_id, :challenge_id, :button_action) end

Option 3 - bigger changes, but I like it best

form

<%= 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

Either option should get you past this particular error. However, I worry that you're not fully understanding how pieces of your code work together. I expect the next part of your controller to behave differently than you'll expect:

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

You may want to play with form_for and Strong Parameters a bit more to understand how arguments you pass to button and such turn into HTML, which then turn into params, and how they're handled in the controller.

Strong parameters seem to be dropping the "accept" value since it's not being associated with "dueler". I might try putting a hidden check box in the view and then calling a function via an on-click listener that sets the check box to the appropriate value and then submits the form.

I wouldn't say it's the "right" way, but it may work for your case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM