NoMethodError в методе контроллера Rails 5

Редактировать №2

Вот журнал сервера, когда я нажимаю галочку

Started PUT "/course_modules/module-1-understanding-email-marketing-basics/complete" for 127.0.0.1 at 2018-09-19 16:29:42 +0100
Processing by CourseModulesUsersController#complete as HTML
  Parameters: {"authenticity_token"=>"CfIM56PhiIRumytV99CE7GFK6tYumCgDvBwUS79jhbCr3zpXLfbJgvqUFkzwmKLXQiOxk1SmFvGoO4+M1z87wg==", "id"=>"module-1-understanding-email-marketing-basics"}
  CourseModulesUser Load (0.7ms)  SELECT  "course_modules_users".* FROM "course_modules_users" WHERE "course_modules_users"."id" = $1 LIMIT $2  [["id", 0], ["LIMIT", 1]]
  ↳ app/controllers/course_modules_users_controller.rb:3
Completed 500 Internal Server Error in 6ms (ActiveRecord: 0.7ms)



NoMethodError (undefined method `complete=' for nil:NilClass):

app/controllers/course_modules_users_controller.rb:4:in `complete'

Изменить №1

Итак, вот где я сейчас.

Я могу получить доступ к записям с помощью консоли rails

irb(main):017:0> @course_modules_users = CourseModulesUser.find_by(id: 1)
  CourseModulesUser Load (0.4ms)  SELECT  "course_modules_users".* FROM "course_modules_users" WHERE "course_modules_users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<CourseModulesUser id: 1, course_module_id: 1, courses_user_id: 1, complete: false, created_at: "2018-09-19 13:04:16", updated_at: "2018-09-19 14:58:17">
irb(main):018:0> @course_modules_users.complete = true
=> true

Если я попытаюсь проверить на основе логического значения, подобного этому

<% if @course_modules_users.where(complete: true).nil? %>
  <i class="fas fa-check text-green float-left mr-1"></i>
  <span class="text-xs mr-2">Completed</span>
<% else %>
  <%= link_to complete_course_module_path(course_module), method: :put do %>
  <i class="fas fa-check text-grey-darkest float-left mr-2"></i>
  <% end %>
<% end %>

Шоу как

image

Но если я вручную изменю запись

image

на фронтенде ничего не меняется

image

Исходный

Вот моя ошибка:

image

Итак, в настоящее время у меня есть настройка маршрута, которая после нажатия запускает следующий метод complete с изменением записи на true. Однако, как вы можете видеть, он не может найти полный метод.

Вот база данных

база данных

Я проверил это в терминале, и он может найти полное поле

termial


person Community    schedule 19.09.2018    source источник


Ответы (1)


В сообщении об ошибке говорится, что @course_modules_user равно нолю, что свидетельствует о неправильном использовании метода complete. Итак, вы определили

@course_modules_user = CourseModulesUser.find_by(id: params[:id]) 

Проверьте params и убедитесь, что у вас есть запись со значением params[:id] в таблице course_modules_users, так что @course_modules_user не равно нулю.

Обновление:

Поскольку вы используете friendly_id, значение id отправляется как slug. Поэтому скажите Rails не делать этого, изменив link_to вот так

<%= link_to complete_course_module_path(course_module.id), method: :put do %>
person Pavan    schedule 19.09.2018
comment
Я бы изменил CourseModulesUser.find_by(id: params[:id]) на CourseModulesUser.find!(params[:id]), чтобы он вызывал ошибку 404, если объект не найден. - person Ben Toogood; 19.09.2018
comment
@B.J.B Обновите вопрос с помощью params, который появляется в журнале сервера, когда вы нажимаете ссылку, чтобы завершить course_module - person Pavan; 19.09.2018
comment
См. редактирование № 2, похоже, он использует слаг friendly_id, а не числовой идентификатор. - person ; 19.09.2018
comment
@B.J.B Вы используете friendly_id? - person Pavan; 19.09.2018
comment
Я, но, очевидно, я хочу использовать идентификатор, а не слаг - person ; 19.09.2018
comment
@BJB Хорошо, попробуйте изменить <%= link_to complete_course_module_path(course_module), method: :put do %> на <%= link_to complete_course_module_path(course_module.id), method: :put do %> - person Pavan; 19.09.2018
comment
О, это сработало, круто. Однако тики по-прежнему не меняются в зависимости от логического значения! - person ; 19.09.2018
comment
@BJB Это еще одна проблема, не связанная с текущей проблемой. Я обновлю свой ответ с изменениями, чтобы вы могли отметить его как принятый. Кстати, вы всегда можете опубликовать вопрос, объясняющий проблему. - person Pavan; 19.09.2018