给出这条路线
match 'posts/hello/:name/:title' => 'post#show', :as => :hello
我可以拨打hello_path
的方式是什么?
如果我致电hello_path(@post)
,它会尝试做什么?
我希望:name
和:title
文件会自动绑定到路径,但似乎rails只知道如何从模型对象中获取:id。
相反,它只有在我称之为
时才有效<%= link_to "link2", hello_url(:name=> @post.name, :title=>@post.title) %>
(缺乏适当的文件真的让我感到害怕)
答案 0 :(得分:17)
回答你的两个问题:
rake routes
以查看其中的路由
你的应用。它将向您展示使用命名路线的所有方法,
只需将“_path”或“_url”添加到显示的路径名称即可
左边。 hello_path(@post)
会生成一个网址
该hello
个实例的显示页面。你打电话的方式是常态:
<%= link_to "link2", hello_url(:name=> @post.name, :title=>@post.title) %>
然而,这也可能有效:
<%= link_to "link2", hello_url(@post.name, @post.title) %>
以下是一些应该有用的文档(Rails API除外)。 http://guides.rubyonrails.org/routing.html
答案 1 :(得分:14)
hello_path
尝试做什么?&#34; hello_path
知道它应该获得多少参数。这是通过计算config/routes
中的命名参数来计算的。它将接受散列或参数列表。如果给它一个哈希值,则键必须与URL参数的名称匹配。如果你给它一个参数列表,它只是按位置匹配它们 - 第一个参数和第一个命名参数。
然后,它会在每个参数上单独调用to_param
,然后将它们全部加在一起(see code here, 4.0 branch)。
如果你想要2个或更多的参数时传入一个物体,它甚至不会在物体上调用to_param。当你得到没有堆栈跟踪的错误时会发生类似的事情
No route matches {:controller=>"posts", :action=>"show", :id=>#<Post ...>}
如果您只有一个命名参数,那么事情就非常简单了。如果您需要按名称而不是ID查找帖子,则可以重新定义to_param
class Post < ActiveRecord::Base
...
def to_param
name
end
end
但是如果网址中有多个命名参数,那么重新定义to_param
就不够了。让我们说你试过这个:
# app/models/post.rb
class Post < ActiveRecord::Base
...
def to_param
{name: name, title: title}
end
end
# app/views/posts/index.html.erb
<%= post_path(post) %>
在这种情况下,您将收到路由错误,因为您没有向post_path传递足够的参数(参见上文)。 要解决此问题,我只需明确致电to_param
:
# app/views/posts/index.html.erb
<%= post_path(post.to_param) %>
这比大多数Rails路由魔法更不光滑,但效果非常好。如果您以后改变了查找帖子的方式,您所要做的就是重新定义to_param。无需担心您称之为post_path
答案 2 :(得分:5)
其他答案(在撰写本文时)很好,但您对GregT答案的回复显示对Rails缺乏了解,这很好 - 我们都去过那里。
具体来说,Rails背后的三个关键原则:约定优于配置,模型 - 视图 - 控制器架构(MVC)和 REST 。这是每个Rails书开头的东西。初学者通常认为他们可以通过代码跳到第一章,但是Rails与许多其他主题不同,因为第一章解释了重要的概念,而不仅仅是介绍章节填充。因为Rails不是“代码”,所以它是一个“代码框架”。
“约定优于配置”意味着如果您遵循某些约定,那么您将受益于Rails中的行为。路由是其中一个领域,如果不是最大的领域,那么惯例会使开发人员受益,尽管它是完全可配置的。
特定路由格式之后的路径将被解析为控制器,操作以及可能的id,格式和其他参数。默认情况下,Rails(以及Sinatra)路径至少采用以下格式和顺序:
/controller_name/action_name
它有点复杂,有更多选项,实际上看起来更像这样:
/controller_name/action_name/(id)(.format)(?param=value)(&...)
...但是这个答案的细节要多于此答案。
控制器是MVC中的C,或处理请求的类。 操作是七个RESTful操作之一(index
,show
,new
,create
,edit
,{{1在该控制器中,}和update
)。并非所有操作都需要ID(destroy
,index
和new
),并且并非所有操作都是create
个请求(生成视图的请求,例如{{1} },get
和destroy
没有观点。)
总结我们看到这个例子:
create
...会将请求路由到传递给身份1的ArticlesController控制器中的'edit'操作。预计控制器将执行一些内务处理,如身份验证和授权,然后检索文章模型( M < / strong> CV)ID为1并将其传递给“编辑”视图(MC V )。
最好,特别是对于新的Rails开发人员,坚持这些约定,并且可能添加一些除REST提供的操作之外的其他操作。
你可以通过在routes.rb文件中配置一个替代的路由方案,而不是关注REST等来超越这个约定,但你会像上游游泳一样鲑鱼 - 它比流程更难。如果你沿着那条道路(双关语)走下去,你将为自己做很多额外的工作,可能会在某种程度上重新发明轮子,并失去Rails框架提供的优势。如果您因任何原因发现自己处于这种情况,也许Rails不适合您的工作。
答案 3 :(得分:4)
你也可以这样称呼它
hello_path(@post.name, @post.title)
希望它有所帮助。