Проблемы с удалением, обновлением в Rails 4.2 и магистрали

Не могу поймать проблему. Не иметь критических ошибок. Все отлично работает в другом приложении Rails с той же конфигурацией.

class PricesController < ApplicationController
  respond_to :json

  def index
    @prices = Price.all

    respond_with @prices
  end

  def show
    respond_with @price
  end

  def update
    @price.update_attributes(price_params)

    respond_with @price
  end

  def create
    @price = Price.create(price_params)

    respond_with @price
  end

  def destroy
    @price.destroy

    respond_with @price
  end

  private

  def price_params
    params.require(:price).permit(:title, :cost)
  end
end

Когда POST все в порядке, добавляется новая цена. Но когда я пытаюсь удалить или обновить, поймать ошибку 500

Started DELETE "/prices/2" for ::1 at 2015-02-10 07:49:24 +0400
Processing by PricesController#destroy as JSON
  Parameters: {"id"=>"2"}
Completed 500 Internal Server Error in 1ms

NoMethodError (undefined method `destroy' for nil:NilClass):
  app/controllers/prices_controller.rb:26:in `destroy'


Started PUT "/prices/2" for ::1 at 2015-02-10 08:12:23 +0400
Processing by PricesController#update as JSON
  Parameters: {"id"=>"2", "title"=>"Price1 update", "cost"=>140, "created_at"=>"2015-02-10T00:04:39.881Z", "updated_at"=>"2015-02-10T00:04:39.881Z", "price"=>{"id"=>"2", "title"=>"Price1 update", "cost"=>140, "created_at"=>"2015-02-10T00:04:39.881Z", "updated_at"=>"2015-02-10T00:04:39.881Z"}}
Unpermitted parameters: id, created_at, updated_at
Completed 500 Internal Server Error in 2ms

NoMethodError (undefined method `update_attributes' for nil:NilClass):
  app/controllers/prices_controller.rb:14:in `update'

Возможно, это проблема с jquery-ujs? Потому что создание в порядке.


person colmer    schedule 10.02.2015    source источник


Ответы (2)


Не похоже, что вы инициализируете @price, поэтому вы получаете сообщение об ошибке. Пытаться:

def destroy
  @price = Price.find(params[:id])
  @price.destroy
  ...
end

Вам также потребуется инициализировать @price в действиях show и update.

person Jordan Allan    schedule 10.02.2015

Вы должны прочитать ошибки, ruby ​​точно скажет вам, в чем проблема:

NoMethodError (undefined method `destroy' for nil:NilClass):
  app/controllers/prices_controller.rb:26:in `destroy'

Итак, строка 26 - это @price.destroy, поэтому ошибка говорит вам, что нет метода destroy для nil, т.е. это говорит вам, что @price это nil, т.е. это не установлено. То же самое с update, за исключением того, что update_attributes вызывается для нулевого объекта.

Надеюсь, это все, что вам нужно, чтобы увидеть проблему здесь, т.е. вы не устанавливаете @price в своих действиях destroy или update, а также в своем действии show, кстати.

person smathy    schedule 10.02.2015
comment
Спасибо, но это работа в другом приложении. В codeschool анатомия основы они не определить переменные в контроллере. - person colmer; 10.02.2015
comment
Ой, вы отвергаете мой ответ, а затем принимаете чей-то другой, который сказал то же самое. Это жалит человека ;) Приложение, на которое вы ссылаетесь, делает определение переменных, посмотрите на файл before_filter. - person smathy; 10.02.2015