Редактировать фильм в Rails редактирует все объекты фильма вместо того, о котором идет речь - PullRequest
0 голосов
/ 05 октября 2018

У меня есть приложение со списком фильмов, в котором я могу создавать списки и добавлять к ним фильмы.У меня есть форма для редактирования фильма, но когда я отправляю форму, она обновляет все объекты фильма в списке, а не только выбранный.Я озадачен тем, почему это происходит, и мог бы использовать второй набор глаз.

Моя кнопка на странице отображения списка, которая переводит меня в форму для редактирования фильма:

<%= button_to "Edit movie", edit_movie_path(m), method: 'get', class: 'btn btn-primary btn-sm btn-space' %>

Мои действия контроллера по редактированию и обновлению в movies_controller.rb:

  def edit
   @movie = Movie.find(params[:id])
  end

  def update
    @movie = Movie.find(params[:id])
    @movie = Movie.update(movie_params)
    redirect_to root_path
  end

И моя форма:

  <%= simple_form_for @movie do |f| %>

    <div class="form-group">
      <%= f.input :title, placeholder: "Movie Title", input_html: { class: 'form-control' } %>
    </div>

    <div class="form-row">
      <div class="form-group col-md-6">
        <%= f.input :year, as: :date,
            start_year: Date.today.year,
            end_year: Date.today.year - 100, 
            discard_day: true, discard_month: true, order: [:year], 
            input_html: { class: 'form-control' } %>
      </div>

      <div class="form-group col-md-6">
         <%= f.input :genre, placeholder: "Genre", input_html: { class: 'form-control' } %>
      </div>
    </div>

    <div class="form-group">
       <%= f.input :poster, placeholder: "Poster URL", input_html: { class: 'form-control' } %>
    </div>

    <div class="form-row">
      <div class="form-group col-md-6">
         <%= f.input :director, placeholder: "Director",
            input_html: { class: 'form-control' } %>
      </div>

      <div class="form-group col-md-6">
         <%= f.input :rating, collection: 1..5, prompt: "1(bad) - 5(great)", input_html: { class: 'form-control' } %>
      </div>
    </div>

    <div class="form-group">
      <%= f.association :lists, as: :check_boxes, multiple: true, input_html: { class: 'form-control' } %>
    </div>

    <div class="form-group">
      <%= f.input :plot, as: :text, placeholder: "Plot Summary", input_html: { class: 'form-control' } %>
    </div>

    <div class="form-group text-center">
      <%= f.button :submit, "Add Movie", class: "btn btn-primary col-md-4" %> 
    </div>

  <% end %>

Есть идеи здесь?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

В вашем коде есть опечатка:

def edit
  @movie = Movie.find(params[:id])
end

def update
  @movie = Movie.find(params[:id])
  @movie = Movie.update(movie_params)
  redirect_to root_path
end

Должно быть:

def edit
  @movie = Movie.find(params[:id])
end

def update
  @movie = Movie.find(params[:id])
  @movie.update(movie_params)
  redirect_to root_path
end

Вы можете заметить, что Movie.update изменилось на @movie.update.Это связано с тем, что Movie.update будет обновлять каждую запись в таблице movies в вашей базе данных.в то время как @movie.update будет обновлять только выбранный фильм из @movie = Movie.find(params[:id]).

Надеюсь, это поможет вам и прояснит ситуацию.

0 голосов
/ 05 октября 2018

Movie.update(movie_params) вызовет sql-запрос для обновления всех записей модели Movie, для обновления одной записи необходимо вызвать update только для этого объекта.Надеюсь, что вам все ясно.

  def update
    @movie = Movie.find(params[:id])
    @movie = @movie.update(movie_params)
    redirect_to root_path
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...