Rails - 除“id”之外的find_by列导致“null”

时间:2013-11-17 02:59:21

标签: ruby-on-rails ruby

过去几个小时一直试图让这个工作,我可能看起来很简单。基本上我有一个“posts”模型,我创建的一个列名为guid,它只是一个用户可定义的字段,可以保存到数据库中。

我希望find_by guid而不是默认id

当然我在帖子控制器@post = Post.find_by_guid(params[:guid])操作中尝试show,但当我尝试从网址(例如:mysite / post / 53)调用它时,在服务器控制台中说guid is NULL

Webrick控制台:

Processing by PostsController#show as HTML
  Parameters: {"id"=>"53"}
  Post Load (0.4ms)  SELECT "posts".* FROM "posts" WHERE "posts"."guid" IS NULL LIMIT 1
....

3 个答案:

答案 0 :(得分:1)

如果路线是

get "/posts/:id"

然后你将它的id放在你可以在输出中看到的参数中。所以使用params [:id]

@post = Post.find(params[:id])

如果您传递GUID

,则应更改路线
get "posts/:guid" ...

点击网址“posts / 21EC2020-3AEA-1069-A2DD-08002B30309D”

然后在控制器中:

@post = Post.find_by guid: params[:guid]

Rails将控制器中设置的实例变量(以@开头的任何变量)传递给视图。 在控制器没有设置的视图中引用实例变量将返回nil,它没有你要调用的任何方法,因此出现“No method”错误。

任何时候遇到麻烦,请在控制台检查您的假设。我建议使用Pry。使用Pry(在代码中调用“binding.pry”)实际上可以在任何时候停止执行并环顾四周。这样你就不用猜了。

答案 1 :(得分:0)

不推荐使用find_by_[column]方法。

使用以下语法:find_by guid: params[:guid]

答案 2 :(得分:0)

您的参数哈希不包含:guid密钥。如果您使用mysite/post/53?guid=SOMETHING,则会在:guid中看到params键。

您希望此示例中的53是GUID参数吗?有一些方法可以更改Rails路由以使该参数为guid而不是id,但如果53是GUID,则可以随时进行:

Post.find(:guid => params[:id]).first