【问题标题】:Trouble creating custom routes in Ruby on Rails 3.1在 Ruby on Rails 3.1 中创建自定义路由时遇到问题
【发布时间】:2011-12-27 09:20:31
【问题描述】:

我似乎无法设置自定义 URL。所有 RESTful 路由都可以正常工作,但我无法弄清楚如何简单地将 /:unique_url 添加到我在模型中创建的现有路由(一个简单的 4 个字符的随机字符串)并将用作各种“永久链接” .

Routes.rb

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

控制器

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

这是因为我试图在现有资源上定义自定义操作吗?我不能在具有资源的控制器上创建自定义方法吗?

顺便说一句,当我将 routes.rb 更改为 match 'treks/:id/:unique_url' => treks#mobile 时,它工作正常,但我只想将 url 简单地设为 /:unique_url

更新 看来find_by_[parameter] 是要走的路……

我一直在玩控制台,但我似乎无法找到任何方法来提出...例如,我可以运行Trek.last.fullname,但无法运行@trek = Trek.last...然后调用... @trek.lastname 例如。任何线索为什么?我认为这是我的问题。

【问题讨论】:

  • 您的mobile 方法使用params[:id],但您的路线中没有:id。您需要在模型中创建一个 find_by_unique_url 方法(如果您还没有)并在您的 mobile 方法中使用它。
  • 谢谢马克,我在哪里创建这个方法?
  • 如果您有 unique_url 字段,那么您已经拥有它。在 Rails 控制台中,您可以执行 Trek.find_by_unique_url(url),其中 url 是匹配的 unique_url,您会看到结果。
  • 当我在控制台中运行它时,它显示未定义的方法...我认为似乎无法让find_by_unique_url 工作。它必须在我的模型中的某个地方吗?
  • @MarkThomas 你能看看我的更新吗...我认为这可能是问题的原因...谢谢!

标签: ruby routing controller ruby-on-rails-3.1


【解决方案1】:

那么 Trek 上是否有一个存储其唯一 url 的字段?如果是这样,您应该这样做:

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

【讨论】:

  • 我有一个字段 :unique_url 我在回调 before_save 函数中创建。
  • 所以在这种情况下应该是trek.find_by_unique_url(params[:unique_url])
  • @pruett 不,find_by_XXX 方法是通过 Ruby 的 method_missing 调用即时生成的!因此,您可以使用您在模型中定义的任何属性来代替 XXX
  • 嗯...我的控制器中现在有它...但它似乎不起作用。我得到undefined method 'fullname' for nil:NilClass(全名)是我认为<%= @trek.fullname %> 调用的模型的另一个属性
  • 确实,请参阅“基于动态属性的查找器”下的 apidock.com/rails/ActiveRecord/Base。你也可以Trek.where(:unique_url => params[:unique_url])[0],做同样的事情
【解决方案2】:
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 ,这意味着你试图调用该方法的对象不存在,例如是零。

您可能只是错过了在该行之前放置一个 if 语句以确保该对象是非零

【讨论】:

  • 我不知道它是什么...会不会是我一直打错字????无论如何......现在似乎正在工作。我认为我的属性unique_url 在每次刷新时都会不断变化,所以我在追逐一个移动的目标,谢谢你的帮助。
【解决方案3】:

嗯。我通常会这样做:

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

然后在该控制器中,该 ID 将不适用..您需要将其更改为以下内容:

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

(如果 unique_url 是要搜索的列)

【讨论】:

  • 哈.. 是的,我的大多数应用程序仍然停留在 2.3 中。. 还没有得到所有新的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多