2011-11-11 58 views
1

我似乎无法设置自定义URL。所有的RESTful路线工作正常,但我不知道如何简单地将/:unique_url添加到我在模型中创建的现有路线(一个简单的4个字符的随机字符串),并将作为排序的“固定链接”。无法在Ruby on Rails 3.1中创建自定义路由

的routes.rb

resources :treks 
match ':unique_url' => 'treks#mobile' 

控制器

. 
. 
def mobile 
    @trek = trek.find(params[:id]) 
end 

这是因为我试图确定在现有资源的自定义操作?我可以不使用资源在同一个控制器上创建自定义方法吗?

顺便说一句,当我改变routes.rbmatch 'treks/:id/:unique_url' => treks#mobile它工作正常,但我只是想的URL仅仅是/:unique_url

更新好像find_by_[parameter]是要走的路...

我一直在玩的控制台,我似乎无法得到任何方法挺身而出......我可以运行Trek.last.fullname例如,但不能运行@trek = Trek.last ......然后打电话...例如,。任何线索为什么?我认为这是我的问题。

+1

你'mobile'方法使用'PARAMS [:编号]',但你不你的路线里有':id'。你需要在你的模型中创建一个'find_by_unique_url'方法(如果你还没有),并在你的'mobile'方法中使用它。 –

+0

感谢马克,我在哪里创建此方法? – pruett

+0

如果你有'unique_url'字段,那么你已经有了。在Rails控制台中,您可以执行'Trek.find_by_unique_url(url)',其中'url'与unique_url匹配,您将看到一个结果。 –

回答

0
trek.find_by_unique_url(params[:unique_url]) # should do the trick 

@pruett没有,会生成find_by_XXX方法通过Ruby的method_missing的呼叫即时!因此,您可以使用您在模型中定义的任何属性而不是XXX。

,你甚至可以去尽可能列出多个属性,如:

find_by_name_and_unique_url(the_name, the_unigue_url) 

检查这些页面:

http://guides.rubyonrails.org/active_record_querying.html

http://m.onkey.org/active-record-query-interface


如果你得到一个undefined method ... for nil:NilClass,这意味着th您尝试调用该方法的e对象不存在,例如是零。

你可能只是错过了把if语句在该行之前,确保对象是非零

+0

我不知道它是什么...可能是我整个时间打错了吗?反正......现在似乎在工作。我认为我的属性unique_url在每次刷新时都会不断变化,所以我正在追逐一个移动目标,感谢您的帮助。 – pruett

1

那么在Trek上有一个存储其独特url的字段?如果是这样,你应该做这样的事情:

@trek = Trek.find_by_url(params[:unique_url]) 
+0

我有一个领域':unique_url',我在回调'before_save'函数中创建。 – pruett

+0

所以在这种情况下,我会定义'find_by_unique_url'方法吗?'trek.find_by_unique_url(params [:unique_url])' –

+0

? – pruett

-1

嗯。我通常会做这样的事情:

map.connect "/:unique_url", :controller => "treks", :action => "mobile" 

然后在控制器中的ID是不会适用..你需要改变它的东西是这样的:

def mobile 
    @trek = trek.find_by_unique_url(params[:unique_url]) 
end 

(也就是如果unique_url正在搜索的列)

+0

这不是Rails 3.1语法。 –

+0

是啊...抛出一个错误与Rails 3.1 – pruett

+0

哈..是啊我的大部分应用程序仍然在2.3 ..仍然没有得到所有的新东西了。 – wejrowski