Ошибка ArgumentError (неправильное количество аргументов), но вы не знаете, какие параметры отсутствуют в Rails? - PullRequest
0 голосов
/ 26 марта 2019

Я знаю, что это такая распространенная ошибка в Rails, но я не могу понять, какие параметры отсутствуют.

Я исправляю запрос на выборку из React в Rails для обновления Sighting, который является таблицей соединения для Animal и User. Модель sighting имеет has_one_attached с использованием Active Storage. Это называется image и не обязательно должно быть атрибутом таблицы Sighting, но из того, что я понимаю, должно быть в strong_params.

Вот выборка React:

  editSighting = (title, body, animalId, sightingId) => {

    fetch(`http://localhost:9000/api/v1/sightings/${sightingId}`, {
      method: "PATCH",
      headers: {
        "Content-Type": "application/json",
        "Accept": "application/json",
        "Authorization": localStorage.getItem("token")

      },
      body: JSON.stringify({
        title: title,
        body: body,
        likes: this.state.likes,
        animal_id: animalId,
        user_id: this.state.currentUser.id
    })
  })
  .then(r => r.json())
  .then(newSighting => {
    this.setState({ sightings: [...this.state.sightings, newSighting ]})
  })

Вот это SightingController:


class Api::V1::SightingsController < ApplicationController
  before_action :find_sighting, only: [:update, :show, :destroy]

  def index
   @sightings = Sighting.all
   render json: @sightings
  end




  def create
    @sighting = Sighting.new(sighting_params)
    @sighting.image.attach(params[:sighting][:image])
     if @sighting.save && @sighting.image.attached
      render json: @sighting, status: :accepted
    else
      render json: { errors: @sighting.errors.full_messages }, status: :unprocessible_entity
    end
  end


  def update
    # if curr_user.id == @sighting.user_id
   @sighting.update(sighting_params)
   if @sighting.save
     render json: @sighting, status: :accepted
   else
     render json: { errors: @sighting.errors.full_messages }, status: :unprocessible_entity
   end
  end


  def destroy
    if curr_user.id == @sighting.user_id
      @sighting.image.purge_later
      @sighting.delete
      render json: "sighting deleted"
    else
      render json: { errors: "You are not authorized to delete"}
    end
  end


  private

  def sighting_params
   params.require[:sighting].permit(:title, :body, :likes, :image, :user_id, :animal_id)
  end

  def find_sighting
   @sighting = Sighting.find(params[:id])
  end
end

модель Sighting

class Sighting < ApplicationRecord
  has_one_attached :image

  def image_filename
    self.image.filename.to_s if self.image.attached?
  end

  def image_attached?
    self.image.attached?
  end

  belongs_to :user
  belongs_to :animal
  has_many :comments, :as => :commentable, dependent: :destroy

end

и ModelSerializer:

class SightingSerializer < ActiveModel::Serializer
  include Rails.application.routes.url_helpers


  attributes :id, :title, :body, :likes, :image, :created_at

 belongs_to :animal
 belongs_to :user
 has_many :comments, :as => :commentable, dependent: :destroy

 def image
   rails_blob_path(object.image, only_path: true) if object.image.attached?
 end

end

Я смог обновить прицел через консоль Rails без проблем, просто обновив title.

Ошибка Rails:

Completed 500 Internal Server Error in 7ms (ActiveRecord: 6.2ms)



ArgumentError (wrong number of arguments (given 0, expected 1)):

app/controllers/api/v1/sightings_controller.rb:48:in `sighting_params'
app/controllers/api/v1/sightings_controller.rb:25:in `update'

А вот обновление запускается из консоли:

2.6.0 :017 > Sighting.first.update(title: "In NYC?? What a surprise!") 
  Sighting Load (0.6ms)  SELECT  "sightings".* FROM "sightings" ORDER BY "sightings"."id" ASC LIMIT $1  [["LIMIT", 1]]
   (0.2ms)  BEGIN
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 39], ["LIMIT", 1]]
  Animal Load (0.4ms)  SELECT  "animals".* FROM "animals" WHERE "animals"."id" = $1 LIMIT $2  [["id", 231], ["LIMIT", 1]]
  Sighting Update (0.6ms)  UPDATE "sightings" SET "title" = $1, "updated_at" = $2 WHERE "sightings"."id" = $3  [["title", "In NYC?? What a surprise!"], ["updated_at", "2019-03-26 16:23:11.098248"], ["id", 7]]
   (2.2ms)  COMMIT
 => true 

1 Ответ

0 голосов
/ 26 марта 2019

Я включу синтаксическую ошибку в параметры вашего контроллера, которая была исправлена ​​комментаторами:

params.require(:sighting)...

Во-вторых, вам нужно передать свой JSON с этим параметром sighting, заключив его в ноль, потому чтоэто требуется вашим контроллером:

fetch(`http://localhost:9000/api/v1/sightings/${sightingId}`, {
   method: "PATCH",
   headers: {
     "Content-Type": "application/json",
     "Accept": "application/json",
     "Authorization": localStorage.getItem("token")
   },
   body: JSON.stringify({
     sighting: {
        title: title,
        body: body,
        likes: this.state.likes,
        animal_id: animalId,
        user_id: this.state.currentUser.id
    }
})

Это даст вам правильные параметры, когда вы PUT на ваш контроллер.В противном случае он не сохранит ваши значения, потому что они не пройдут базовую проверку параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...