我正在尝试实现一个按钮来更新记录的单个属性(将“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的记录吗?我还没有看到任何其他记录被此代码破坏。如果需要任何其他文件进行检查,请与我们联系。
答案 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?'