Ruby on Rails - почему я сталкиваюсь с возможными непревзойденными ограничениями [: exerc_id] - PullRequest
0 голосов
/ 25 сентября 2018
def edit    
  @exercise = Exercise.find(params[:exercise_id])      
  @play = @exercise.plays.find(params[:id])    
end

def update    
  @exercise = Exercise.find(params[:exercise_id])
  @play = @exercise.plays.find(params[:id])    
  if @exercise.plays.update_attributes(play_params)       
    redirect_to @exercise_path      
  else    
    render action: :edit    
  end
end

частичное представление, отображаемое для отображения всех созданных пьес, имеет

<p><%= play.name %></p>
<p><%= play.sets %></p>
<p><%= play.reps %></p>
<%= link_to "edit", edit_exercise_play_path( @exercise, play) %>

, то есть plays_controller: edit,: метод update, на самом деле у меня есть два класса, один - ExerciseController, а другойодин из них - PlaysController, ExerciseController has_many, я рендерил две партиалы, одну для создания игры, а другую - для показа этой игры на той же странице в той части, которая воспроизводит игру после создания, но теперь я хочу добавитьвозможность редактирования с помощью edit_exercise_play_path,

<%= link_to "Edit", edit_exercise_play_path(@play) %>

, после этого я сталкиваюсь с непревзойденной ошибкой ограничения. Спасибо

resources :exercises do
resources :plays
end

Show.html.erb из ExercisesController

<h2>Your Workout Details </h2>
<p><%= @exercise.workout  %></p>
<p><%= @exercise.mode %></p>
<p><%= @exercise.date.strftime("on %A at %H:%M Dated as %d %B") %></p>
<p><%= @exercise.length %></p><br />
<h3> Games you Played </h3>
<%= render @exercise.plays %>
<h3>Add new Game </h3>
<%= render 'plays/form' %>
<%= link_to "Edit", edit_exercise_path %> |  |
<%= link_to "Destroy", exercise_path(@exercise), :confirm => "Are you 
sure?", :method => :delete %> | |
<%= link_to "Back", root_path %>

"Журналы" GET запущен "/ упражнения / 5" для 127.0.0.1 в 2018-09-25 18:12:21 +0500 Обработка с помощью ExercisesController # показать как параметры HTML: {"id" => "5"} УпражнениеLoad (0.0ms) ВЫБРАТЬ «упражнения». * ОТ «упражнения» ГДЕ «упражнения». «Id» =?LIMIT?[["id", 5], ["LIMIT", 1]] Упражнения на рендеринг / show.html.erb Play Load (0.0ms) SELECT "plays". * FROM "воспроизводит" WHERE "проигрывает". "exerc_id" =?[["exerc_id", 5]] Рендеринг коллекции plays / _play.html.erb [6 раз] (14,0 мс)мс)

1 Ответ

0 голосов
/ 25 сентября 2018

В соответствии с вашими маршрутами, помощнику пути edit_exercise_play_path также требуется значение для ключа :exercise_id.Но вы не проходите мимо.Изменение link_to на ниже должно исправить вашу проблему

<%= link_to "Edit", edit_exercise_play_path(@exercise, @play) %>

Обновление:

Согласно нашему обсуждению в чате, редактирование link_to должно выглядеть следующим образомниже

<%= link_to "Edit", edit_exercise_play_path(@exercise, play) %>

при рендеринге партиала с <%= render @exercise.plays %>, который создает переменную play.

неопределенный метод `имя_модели 'для nil: NilClass

Для этого вы должны изменить <%= render 'form' %> на <%= render 'form' , exercise: @exercise, play: @play %> и в _form.html.erb изменить первую строку формы на <%= simple_form_for ([exercise, play]) do |f| %>

undefined метод `update_attributes 'дляPlay :: ActiveRecord_Associations_CollectionProxy: 0x0000000f69c710

Причина этой ошибки в вашем методе обновления, который у вас есть @exercise.plays.update_attributes(play_params).Это означает, что вы звоните update_attributes при сборе.Вы должны изменить

if @exercise.plays.update_attributes(play_params)

на

if @play.update_attributes(play_params)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...