Обновление одного объекта ActiveRecord, вывод консоли кажется проблематичным

Я пытаюсь реализовать кнопку для обновления одного атрибута (установив для логического значения «Актив» значение 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..." чепуху, и я видел это:

    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)

Обратите внимание на строку Movie Exists. WHERE ... movies.id != 334...даже несмотря на то, что строка прямо над ней НАХОДИТ запись, использующую этот идентификатор. Это кажется плохим, верно? Просто взгляните на код, который я разместил здесь, может ли кто-нибудь увидеть, что я делаю, чтобы попытаться обновить записи, которые не соответствуют связанному с ним movie.id? Я не видел никаких других рекордов, побитых этим кодом. Если какие-либо дополнительные файлы необходимы для проверки, дайте мне знать.


person Brad Rice    schedule 11.01.2013    source источник


Ответы (2)


Похоже, у вас есть подтверждение уникальности названия фильма. Эта линия Movies Exists, вероятно, в порядке.

Параметры странные - почему params включает параметр «m». Вы ищете параметр «фильмы», а объект «m» должен был быть фильмом. Я бы посмотрел на это.

Вот пример 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?'
person Mark Swardstrom    schedule 11.01.2013
comment
Это сработало отлично! Причина, по которой я использую button_to, заключается в том, что эта кнопка появляется в строке таблицы; Я не использую форму здесь. Но спасибо за понимание! - person Brad Rice; 13.01.2013

Ваши параметры

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

Следовательно

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

Так изменить

@movie.update_attributes(params[:movie])

To

@movie.update_attributes(params[:m])

и это должно работать

person Salil    schedule 11.01.2013
comment
Это было очень близко к ответу на мой вопрос, вы только что предложили мне изменить свои параметры в контроллере, когда мне нужно было только изменить то, как я назвал параметры в представлении, так что голосуйте! Большое спасибо! - person Brad Rice; 13.01.2013