ruby-on-railsrubybest-in-place

Best In Place for Rails ParameterMissing


I'm having trouble getting Best In Place to update. This is the first time I've used this gem or made a Rails app so I'm sure I'm just missing something simple even though I've scoured the documentation and searched through other questions here.

This is the error I get in the console:

Started PUT "/tasks/1" for 127.0.0.1 at 2016-04-22 11:52:10 -0600
Processing by TasksController#update as JSON
  Parameters: {"authenticity_token"=>"cAwRbx8JeYDMG1LrR7nl0VQfwW/x00RUd8rsTP8Iwc
0=", "tasks"=>{"title"=>"Task 1sadsads"}, "id"=>"1"}
  Task Load (0.0ms)  SELECT  "tasks".* FROM "tasks"  WHERE "tasks"."id" = ?  ORD
ER BY priority ASC LIMIT 1  [["id", 1]]
  CACHE (0.0ms)  SELECT  "tasks".* FROM "tasks"  WHERE "tasks"."id" = ?  ORDER B
Y priority ASC LIMIT 1  [["id", "1"]]
Completed 400 Bad Request in 3ms

ActionController::ParameterMissing (param is missing or the value is empty: task
):
  app/controllers/tasks_controller.rb:99:in `task_params'
  app/controllers/tasks_controller.rb:62:in `update'


  Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.1.8
/lib/action_dispatch/middleware/templates/rescues/_source.erb (1.0ms)
  Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.1.8
/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb (0.0ms)
  Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.1.8
/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb
 (0.0ms)
  Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.1.8
/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb (36.0ms)

My controller:

  class TasksController < ApplicationController
  before_action :set_task, only: [:show, :edit, :update, :destroy]

  # GET /tasks
  # GET /tasks.json
  def index
    @tasks = Task.all
    respond_to do |type|
      type.html
      type.json {render :json => @task}
    end
  end



  # GET /tasks/1
  # GET /tasks/1.json
  def show
          @task = Task.find params[:id]
    respond_to do |format|
      format.html
      format.json {render :json => @task}
    end
  end

  # GET /tasks/new
  def new
    @task = Task.new
  end

  # GET /tasks/1/edit
  def edit
  end

  # POST /tasks
  # POST /tasks.json
  def create
    @task = Task.new(task_params)

    respond_to do |format|
      if @task.save
        format.html { redirect_to @task, notice: 'Task was successfully created.' }
        format.json { render :show, status: :created, location: @task }
      else
        format.html { render :new }
        format.json { render json: @task.errors, status: :unprocessable_entity }
      end
    end
  end

   def sort
    params[:order].each do |key,value|
      Task.find(value[:id]).update_attribute(:priority,value[:position])
    end
    render :nothing => true
  end

  # PATCH/PUT /tasks/1
  # PATCH/PUT /tasks/1.json
  def update
        @task = Task.find params[:id]
   if @task.update(task_params)
      respond_to do |format|
        format.html { redirect_to( @task )}
        format.json { render :json => @task }
      end
    else
      respond_to do |format|
        format.html { render :action  => :edit } # edit.html.erb
        format.json { render :nothing =>  true }
      end
    end
  end







  # DELETE /tasks/1
  # DELETE /tasks/1.json
  def destroy
    @task.destroy
    respond_to do |format|
      format.html { redirect_to tasks_url, notice: 'Task was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_task
      @task = Task.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def task_params
      params.require(:task).permit(:title, :description, :priority)
    end
end

My view partial:

    <div class="panel panel-default" data-id="<%= task.id %>">
      <div class="panel-heading">
        <h3 class="panel-title"><span class="rest-in-place" data-url="/tasks/<%= task.id %>" data-object="tasks" data-attribute="title" data-placeholder="Enter a title">
        <%= task.title %>
    </span></h3>
      </div>
      <div class="panel-body">
        <%= truncate task.description, length: 50 %>
      </div>
    </div>

I really appreciate any help I can get. I'm 99% sure it's something I configured wrong in the controller, I just can't for the life of me figure out what it is.

EDIT: The background for this is that I have a bunch of 'Tasks' and I want to list them all on the index and be able to update any task on the index just by clicking on the title.


Solution

  • ActionController::ParameterMissing (param is missing or the value is empty: task
    ):
    app/controllers/tasks_controller.rb:99:in `task_params'
    app/controllers/tasks_controller.rb:62:in `update'
    

    This is telling you that there is no parameter with the name of :task. You can see your parameters above this message.

    Parameters: {"authenticity_token"=>"cAwRbx8JeYDMG1LrR7nl0VQfwW/x00RUd8rsTP8Iwc
    0=", "tasks"=>{"title"=>"Task 1sadsads"}, "id"=>"1"}
    

    You have tasks in your params here. This information is coming from your view.

    data-object="tasks"
    

    Try changing this piece in your view to task and it should send the request correctly.