Rails неопределенный метод `persisted? ' - PullRequest
0 голосов
/ 26 ноября 2018

Я работаю с использованием rails. Мой проект make API использует mongodb

, и я получил эту ошибку:

NoMethodError: неопределенный метод `persisted? 'Для ActionController :: Параметры: 0x000055f487fc4ac8

Эта ошибка в моем контроллере при создании метода:

  def create
    if @merchant.order.push(get_params)
     render json: {:response => true, :status => "ok"}
    else
     render json: {:response => false, :status => "ok"}
    end
  end

  def get_params
  params.required(:order).permit!
  end

Это моя модель:

class Order
 include Mongoid::Document
 include Mongoid::Timestamps

 field :items
 field :grand_total, type: Integer

 belongs_to :merchant
end

Я ценю любую поддержку, спасибо.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

push примите экземпляр Order, и я предполагаю, что вы передаете что-то вроде ActionController::Parameters.Кроме того, push всегда возвращает ассоциацию.Я думаю, что если бы это не удалось, это было бы с исключением, и тогда if не имеет смысла.Я предлагаю использовать create вместо этого.Поэтому (при условии, что get_params является экземпляром ActionController::Parameters или Hash и что order является отношением has_many):

if @merchant.order.create(get_params)
   render json: {:response => true, :status => "ok"}
  else
   render json: {:response => false, :status => "ok"}
  end
end

Если это отношение hash_one, оно должно бытьчто-то вроде:

params = get_params.merge(merchant: @merchant)
if @Order.create(params)
   render json: {:response => true, :status => "ok"}
  else
   render json: {:response => false, :status => "ok"}
  end
end
0 голосов
/ 26 ноября 2018

Насколько я понимаю, push принимает запись (модель), а не хэш параметров:

label = Label.first
label.bands.push(Band.first)

Документы Mongoid проверяет, сохраняется ли модель,поэтому #persisted? вызывается на ActionController::Parameters, который вы передаете туда.

Попробуйте что-то вроде

@merchant.order.push(Order.new(get_params))

, если order - это отношение has_many или

@merchant.order = Order.new(get_params)

если order это отношение has_one.

...