更新单个ActiveRecord对象,控制台输出似乎有问题

时间:2013-01-11 05:00:13

标签: ruby-on-rails sql-update rails-activerecord rails-console

我正在尝试实现一个按钮来更新记录的单个属性(将“Active”布尔值设置为true)。在网上挖掘后,我找到了以下代码来“解决”这个问题:

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

视图创建按钮就好了,应用程序正确执行命令,在MoviesController中运行我的'update'操作:

    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引擎几次(想想对象仍然出现在我的'非活动电影'表上的原因只是因为需要重新编制索引),我看了看控制台输出(我认为这就是所谓的。它只是stdout击中所有started GET "/assets..." mumbo-jumbo,我看到了:

    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)

查看“电影存在”行。 WHERE ... movies.id != 334 ...即使它正上方的行使用该ID查找记录。这看起来不错吧?只是看看我在这里发布的代码,任何人都可以看到我正在尝试更新匹配相关movie.id的记录吗?我还没有看到任何其他记录被此代码破坏。如果需要任何其他文件进行检查,请与我们联系。

2 个答案:

答案 0 :(得分: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])

它应该有效

答案 1 :(得分:0)

看起来您对电影标题的验证是唯一的。电影存在线可能还行。

参数很奇怪 - 为什么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?'