过去几个小时一直试图让这个工作,我可能看起来很简单。基本上我有一个“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
....
答案 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