在Rails中编辑影片可编辑所有影片对象,而不是相关的对象

时间:2018-10-05 03:50:24

标签: ruby-on-rails

我有一个电影列表应用程序,可以在其中创建列表并向其中添加电影。我有一个用于编辑电影的表单,但是当我提交该表单时,它将更新列表中的所有电影对象,而不只是所选的对象。我为为什么发生这种情况而感到困惑,并可能会再用另一双眼睛。

我在列表显示页面上的按钮,该按钮将我带到用于编辑电影的表单:

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

我在movie_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 :(得分:1)

您的代码中有错字:

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])中选定的电影。

希望这对您有所帮助。

答案 1 :(得分:0)

Movie.update(movie_params)将触发sql查询以更新Movie模型的所有记录,以更新单个记录,它只需要对该对象调用update。希望这对您很清楚。

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