Путаница в идентификаторе объекта при редактировании и удалении - PullRequest
0 голосов
/ 05 июля 2018

Укажите идентификатор нужного объекта, при этом первый объект модели всегда удаляется / редактируется. Впервые встретил такую ​​проблему, все проверил. Что не так?

Started DELETE "/questions/6" for 127.0.0.1 at 2018-07-05 10:48:13 +0300
Processing by QuestionsController#destroy as HTML
  Parameters: {"authenticity_token"=>"luh7ShhQ9pWka7wmWMnG4WMQVAnKRjtAJwn0s5at8/GBDOtFjUwZEF70o8hOFOaAN+pVB592V1+egH/PDJVUVA==", "id"=>"6"}
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /Users/gorbunov/.rvm/gems/ruby-2.4.1/gems/activerecord-5.2.0/lib/active_record/log_subscriber.rb:98
  Question Load (0.1ms)  SELECT  "questions".* FROM "questions" WHERE (6) LIMIT ?  [["LIMIT", 1]]
  ↳ app/controllers/questions_controller.rb:86
   (0.0ms)  begin transaction
  ↳ app/controllers/questions_controller.rb:45
  Question Destroy (0.4ms)  DELETE FROM "questions" WHERE "questions"."id" = ?  [["id", 3]]
  ↳ app/controllers/questions_controller.rb:45
   (1.6ms)  commit transaction
  ↳ app/controllers/questions_controller.rb:45
Redirected to http://localhost:3000/questions
Completed 302 Found in 7ms (ActiveRecord: 2.4ms)

Я хочу удалить объект с ID = 6, но удалить объект с ID = 3

Действие Уничтожить в контроллере:

def destroy
   @question = Question.find_by(params[:id])
   @question.destroy
   flash[:success] = 'Вопрос успешно удалён!'
   redirect_to questions_path
  end

Помощник Link_to для удаления объекта:

<%= link_to qest, class: 'btn btn-outline-danger', method: :delete, data: {confirm: "Хорошо подумал?"} do %>

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы используете find_by без упоминания столбца . При использовании без указания столбца find_by использует его как ГДЕ условие

Измените его на Question.find_by(id: params[:id]) (возвращает ноль, если соответствующая запись не найдена) или Question.find(params[:id]) (выдает ошибку ActiveRecord::RecordNotFound, если запись не найдена).

0 голосов
/ 05 июля 2018

Это ключ.

Question Load (0.1ms)  SELECT  "questions".* FROM "questions" WHERE (6) LIMIT ?  [["LIMIT", 1]]
  ↳ app/controllers/questions_controller.rb:86

Это сгенерировано из @question = Question.find_by(params[:id]). Обратите внимание на WHERE (6). find_by принимает либо единственный аргумент необработанного SQL для использования в предложении where, либо столбец и значение. Вы указали только один аргумент, поэтому он интерпретируется как SQL и, таким образом, WHERE (6). Это будет верно для каждого столбца, поэтому вы получаете случайный столбец, в данном случае 3, а затем уничтожаете его.

Вместо этого вы хотите:

@question = Question.find_by(id: params[:id])

Или лучше, используйте find.

@question = Question.find(params[:id])

И если вы собираетесь его уничтожить, используйте destroy в классе .

Question.destroy(params[:id])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...