无法编辑数据库条目

时间:2014-01-17 17:25:38

标签: ruby-on-rails

所以我有这个应用程序,您可以在其中创建用户,然后您可以将电影和节目添加到数据库中。就像IMDB上的坏版本一样?

现在..我有这个控制器:https://github.com/Veske/form/blob/ryhm/app/controllers/movies_controller.rb

我已经设置了电影的路线,并且它还有所有必要的视图文件..但是当我尝试在页面上编辑其中一部电影时:http://whatever.com/shows/1/edit例如,它会给我一个错误:

Couldn't find User with id=1

 def correct_user
    @user = User.find(params[:id])
    redirect_to root_url unless current_user?(@user)
  end
end

params
{"id"=>"1"}

现在..为什么我认为我抛出的参数是@user param,当我有专门为电影制作的更新和编辑控制器时?

4 个答案:

答案 0 :(得分:2)

您似乎不理解routes。您使用params[:id]的上下文是电影控制器,因此,id将是电影ID。与此同时,您使用相同的参数进行身份验证(?),从而为您提供错误。

对于基本身份验证,您可以使用会话哈希,对于更高级的身份验证,有很多宝石,设计最流行。

PS:使用rake routes检查您的可用路线及其网址参数。

答案 1 :(得分:1)

这是MoviesController,因此params[:id]实际上是movie_id,即您的网址“http://whatever.com/shows/1/edit”中的数字“1”。不是user_id。所以它会在行@user = User.find(params[:id])抛出异常。

我查看了您的代码,但找不到正确的user_id应该来自哪里。 Movie模型不belongs_to user。您应该查看user来自哪里。

答案 2 :(得分:1)

您的shows_controller.rb文件在运行您正在调用的编辑操作之前调用correct_user,并且它专门在第70行查找用户。因此,如果有错误,您将收到此错误没有ID为1的用户。

答案 3 :(得分:1)

当我有专门为电影制作的更新和编辑控制器时,为什么我认为我抛出的参数是@user参数?

因为您在控制器顶部有一个在编辑操作中调用的before_action过滤器。

您进入correct_user方法,该方法正在使用基于params[:id]查找用户。要测试这是您的实际问题,您可能需要尝试将控制器中的第68行更改为:

@user = User.last #quick fix

以上内容可以用作快速修复 - 只要您的用户已登录,您就不应该再次发布该错误。如果这样可以避免错误,那么您需要关注自己在控制器调用此User#id方法时正确分配此correct_user值。