Ruby on rails 如何使用带有参数的Rails命名路由助手?

Ruby on rails 如何使用带有参数的Rails命名路由助手?,ruby-on-rails,routes,Ruby On Rails,Routes,考虑到这条路线 match 'posts/hello/:name/:title' => 'post#show', :as => :hello 我可以通过什么方式调用hello\u path 如果我调用hello\u path(@post),它会做什么 我希望:name和:title文件将自动绑定到路径,但rails似乎只知道如何从模型对象中获取:id 相反,只有当我把它叫做 <%= link_to "link2", hello_url(:name=> @post.n

考虑到这条路线

match 'posts/hello/:name/:title' => 'post#show', :as => :hello
  • 我可以通过什么方式调用
    hello\u path

  • 如果我调用
    hello\u path(@post)
    ,它会做什么

我希望
:name
:title
文件将自动绑定到路径,但rails似乎只知道如何从模型对象中获取:id

相反,只有当我把它叫做

<%= link_to "link2", hello_url(:name=> @post.name, :title=>@post.title) %>
@post.name,:title=>@post.title)%>

(缺少适当的文档真的让我很难受)

你也可以这样称呼它

hello_path(@post.name, @post.title)

希望有帮助。

回答您的两个问题:

  • 在命令行中,运行
    rake routes
    ,以查看中有哪些路由 你的应用程序。它将向您展示使用命名路由的所有方法, 只需将“\u path”或“\u url”添加到上显示的路由名称 左派
  • 调用
    hello\u path(@post)
    将生成指向 显示该
    hello
    实例的页面
您称之为标准的方式:

<%= link_to "link2", hello_url(:name=> @post.name, :title=>@post.title) %>
@post.name,:title=>@post.title)%>
但是,这也可能起作用:

<%= link_to "link2", hello_url(@post.name, @post.title) %>

这里有一些文档(RailsAPI除外)应该会有所帮助。

回答您的问题“hello\u path尝试做什么?”
hello\u path
知道应该获取多少参数。这是通过计算
config/routes
中的命名参数得出的。它将接受散列或参数列表。如果给它一个散列,则键必须与URL参数的名称匹配。如果给它一个参数列表,它只会按位置匹配它们——第一个参数和第一个命名参数

然后,将
分别调用每个参数上的_param
,然后再将它们全部连接在一起()

如果在一个对象需要2个或更多参数时传入该对象,它甚至无法调用该对象上的_param。这就是当您得到没有堆栈跟踪的错误时,会显示类似
没有路由匹配{:controller=>“posts”、:action=>“show”、:id=>#}

使用1个命名参数 如果您只有一个命名参数,那么事情就相当简单了。如果您需要按姓名而不是id查找帖子,您可以将
重新定义为_param

class Post < ActiveRecord::Base
  ...
  def to_param
    name
  end
end
在这种情况下,您将得到一个路由错误,因为您没有传递足够的参数来post_path(见上文)为了解决这个问题,我只需显式地调用
到_param

 # app/views/posts/index.html.erb
 <%= post_path(post.to_param) %>
#app/views/posts/index.html.erb
与大多数Rails路由魔术相比,这有点不够流畅,但效果非常好。如果您以后更改了查找帖子的方式,您所要做的就是重新定义为_param。无需担心您调用的所有位置
post\u path

幕后 要查看的相关代码是

其他答案(在撰写本文时)都很好,但您对GregT答案的回答表明您对Rails缺乏了解,这很好——我们都有过

具体来说,Rails背后的三个关键原则是:约定优于配置模型-视图-控制器体系结构(MVC),以及REST。这是每本书开头的内容。初学者通常认为他们可以直接用代码跳到第一章,但是Rails与许多其他主题不同,第一章解释了重要的概念,而不仅仅是介绍章节的填充。因为Rails不是“代码”,它是“代码框架”

“约定优于配置”意味着如果您遵循某些约定,那么您将从Rails中烘焙的行为中获益。路由是其中的一个领域,如果不是最大的,那么约定对开发人员有利,尽管它是完全可配置的

遵循特定路由格式的路径将解析为控制器、操作以及可能的id、格式和其他参数。默认情况下,Rails(以及Sinatra)路径至少采用以下格式和顺序:

/controller_name/action_name
它比这稍微复杂一点,有更多的选项,实际上看起来更像这样:

/controller_name/action_name/(id)(.format)(?param=value)(&...)
…但这比这个答案所需要的更详细

控制器是MVC中的C,或处理请求的类。该操作是该控制器内七个RESTful操作(
索引
显示
新建
创建
编辑
更新
,以及
销毁
)之一。并非所有操作都需要id(
索引
新建
创建
),并且并非所有操作都是
获取
请求(生成视图的请求,例如
销毁
创建
更新
没有视图)

综上所述,我们可以看到以下示例:

/articles/edit/1
…将请求路由到ArticlesController中的“编辑”操作,并传递id 1。预计控制器将执行一些内务管理,如身份验证和授权,然后检索ID为1的文章模型(MCV),并将其传递到“编辑”视图(MCV

最好,特别是对于新的Rails开发人员,坚持这些约定,并在REST提供的操作之外添加一些额外的操作

您可以在routes.rb文件中配置一个替代路由方案,而不是遵循REST等,从而超越这个惯例,但您就像一条逆流而上的鲑鱼——这比顺流而下要困难得多。如果你走这条路(双关语),你会为自己做很多额外的工作,可能会在某种程度上重新发明轮子,并失去Rails框架提供的优势。如果您发现自己处于这种情况,无论出于何种原因,Rails可能不是适合您工作的工具。

谢谢
/articles/edit/1