簡體   English   中英

獲取ArgumentError(錯誤的參數數量)錯誤但不知道Rails中缺少哪些參數?

[英]Getting ArgumentError (wrong number of arguments) error but don't know which params are missing in Rails?

我知道這在Rails中是一個常見的錯誤,但我無法弄清楚params缺失了什么。

我正在修補從React到Rails的獲取請求到Update Sighting ,它是AnimalUser的連接表。 sighting模型使用Active Storage進行has_one_attached 這稱為image ,不一定是Sighting表的屬性,但從我理解的確需要在strong_params中。

這是React fetch:

  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 

我將在您的控制器的參數中包含語法錯誤,該參數由評論者修復:

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輸入控制器時,這將為您提供正確的參數。 否則,它將不會保存您的值,因為它們不會通過您的基本參數驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM