0

レコードの単一の属性を更新する(「アクティブな」ブール値をtrueに設定する)ボタンを実装しようとしています。オンラインで調べた後、問題を「解決」するための次のコードを見つけました。

button_to "Add", movie_path(m, active: true), confirm: "Add this movie?", method: :put, class: "btn"

ビューはボタンを適切に作成し、アプリケーションはコマンドを適切に実行し、MoviesControllerの「更新」アクションを実行します。

    def update
      @movie = Movie.find(params[:id])
      if @movie.update_attributes(params[:movie])
        flash[:notice] = "Movie was successfully updated"
      else
        flash[:error] = "Movie was not changed"
      end
      redirect_to root_path
    end

このボタンを繰り返しクリックし、Thinking Sphinxエンジンを数回再起動した後(オブジェクトが「非アクティブなムービー」テーブルにまだ表示されている理由は、コレクションのインデックスを再作成する必要があるためです)、コンソールの出力を確認しました(私はそれがそれが呼ばれているものだと思います。それはすべてのstarted GET "/assets..."マンボジャンボを撃ち抜くのはただのstdoutであり、私はこれを見ました:

    Started PUT "/movies/334?m%5B%3Aactive%5D=true" for 127.0.0.1 at 2013-01-10 22:41:41 -0600
    Processing by MoviesController#update as HTML
      Parameters: {"authenticity_token"=>"qpcfMEVttjnQJ3Cv2f+tTYBu3/gujijQtn2+17YVPno=", "m"=>{":active"=>"true"}, "id"=>"334"}
      Movie Load (0.4ms)  SELECT `movies`.* FROM `movies` WHERE `movies`.`id` = 334 LIMIT 1
       (0.1ms)  BEGIN
      Movie Exists (0.6ms)  SELECT 1 AS one FROM `movies` WHERE (`movies`.`title` = BINARY '1 Hope' AND `movies`.`id` != 334 AND `movies`.`rec_form` = 'DVD-Rom') LIMIT 1

       (0.2ms)  COMMIT
    Redirected to http://0.0.0.0:3000/
    Completed 302 Found in 114ms (ActiveRecord: 1.3ms)

そのMovieExistsラインをチェックしてください。WHERE ... movies.id != 334...そのすぐ上の行がそのIDを使用してレコードを検索している場合でも。それは悪いようですよね?私がここに投稿したコードを見ているだけで、関連するmovie.idと一致しないレコードを更新しようとするために私が行っていることを誰かが見ることができますか?このコードによって他のレコードが壊れているのを見たことがありません。検査のために追加のファイルが必要な場合は、私に知らせてください。

4

2 に答える 2

1

あなたのパラメータは

{"authenticity_token"=>"qpcfMEVttjnQJ3Cv2f+tTYBu3/gujijQtn2+17YVPno=",
             "m"=> {":active"=>"true"}, "id"=>"334"}

したがって、

params[:m] = {":active"=>"true"}

だから変更

@movie.update_attributes(params[:movie])

@movie.update_attributes(params[:m])

そしてそれはうまくいくはずです

于 2013-01-11T05:27:12.140 に答える
0

映画のタイトルが一意であることが確認されているようです。そのMoviesExistsラインはおそらくOKです。

パラメータがおかしい-なぜパラメータに「m」パラメータが含まれているのか。'movies'パラメータと'm'オブジェクトを探しているのはMovieである必要があります。私はそれを調べます。

これがbutton_toの例です...

= button_to 'test', movie_path(m, 'movie[active]' => true), confirm: "Add this movie?", method: :put, class: "btn"

しかし、ここではbutton_toが最良の選択ではないと思います。フォームを作成するだけです。代わりに、ハードコードされた属性名を必要としない次の方法でそれを行うことができます...

= form_for [@movie] do |f|
    = f.hidden_field :active, value: true
    = f.submit 'Add', :confirm => 'Add this movie?'
于 2013-01-11T05:22:49.767 に答える