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..."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)

查看 Movie Exists 行。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

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

参数很奇怪 - 为什么 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?'
于 2013-01-11T05:22:49.767 回答