Ruby on rails Rails-链接到、路由和嵌套资源
正如我对edge Rails上的嵌套资源的理解,不应该这样做Ruby on rails Rails-链接到、路由和嵌套资源,ruby-on-rails,routes,nested-resources,Ruby On Rails,Routes,Nested Resources,正如我对edge Rails上的嵌套资源的理解,不应该这样做 link_to 'User posts', @user.posts 指向 /users/:id/posts ? routes.rb文件包含 map.resources :users, :has_many => :posts 如果这不是默认行为,是否可以通过执行其他操作来完成?这应该可以: link_to "User Posts", user_posts_path(@user) 链接到“用户帖子”,用户帖子路径(@User)
link_to 'User posts', @user.posts
指向
/users/:id/posts
?
routes.rb文件包含
map.resources :users, :has_many => :posts
如果这不是默认行为,是否可以通过执行其他操作来完成?这应该可以:
link_to "User Posts", user_posts_path(@user)
链接到“用户帖子”,用户帖子路径(@User)
欲了解更多详情,请访问:
与Rishav的路线相同:
link_to "User Posts", [@user, :posts]
这是我的解释 在Rails的早期,您会编写如下路由:
redirect_to :controller => "posts", :action => "show", :id => @post.id
redirect_to post_path(@post)
redirect_to @post
def persisted?
!(new_record? || destroyed?)
end
post_comments_path(@post)
<%= form_for [:admin, @post, @comment] do |f| %>
这样做是尽职尽责地重定向到PostsController
中的show
操作,并使用
@post.id
返回的值。典型的302响应
后来Rails 1.2问世,允许您使用路由助手,如下所示:
redirect_to :controller => "posts", :action => "show", :id => @post.id
redirect_to post_path(@post)
redirect_to @post
def persisted?
!(new_record? || destroyed?)
end
post_comments_path(@post)
<%= form_for [:admin, @post, @comment] do |f| %>
人民欢欣鼓舞
这将有效地做同样的事情post_path
这里将使用@post
对象构建一条路由,该对象看起来像是什么
像/posts/1
然后重定向到
将向该路由发回302响应,浏览器将跟随它
后来的版本(我不记得是哪一个)允许这样的语法:
redirect_to :controller => "posts", :action => "show", :id => @post.id
redirect_to post_path(@post)
redirect_to @post
def persisted?
!(new_record? || destroyed?)
end
post_comments_path(@post)
<%= form_for [:admin, @post, @comment] do |f| %>
人民再次欢欣鼓舞
魔法,但不是真的
任何足够先进的技术都无法与魔法区分开来
虽然这看起来像魔术,但事实并非如此。这实际上是非常非常整洁的。redirect\u to
方法,很像它的近亲link\u to
和form\u for
都使用一种通用的方法来构建url,称为url\u for
。方法的url\u采用了许多不同的方法
各种对象,如字符串、散列甚至模型实例,如上面的示例中所示
它对这些物体的处理是非常整洁的。在上面的重定向到@post
调用的情况下,它检查@post
对象,查看它是Post
类的对象(无论如何,我们假设),并检查该对象是否已在
在某个地方调用持久化?
数据库
所谓“持久化”,我的意思是Ruby对象在数据库的某个地方有一个匹配的记录。活动记录中的持久化?
方法实现如下:
redirect_to :controller => "posts", :action => "show", :id => @post.id
redirect_to post_path(@post)
redirect_to @post
def persisted?
!(new_record? || destroyed?)
end
post_comments_path(@post)
<%= form_for [:admin, @post, @comment] do |f| %>
如果该对象不是通过调用(如Model.new
)创建的,那么它就不会是新记录,如果它没有调用destroy
方法,它也不会是新记录
也没有。如果这两种情况都是真的,那么这就使得对象很可能以记录的形式持久化到数据库中
如果它已被持久化,则
的url\u知道可以找到该对象
在某个地方,可以找到它的地方很可能是在一个名为post\u path
的方法下。所以它调用这个方法,并传递
在该对象的to_param
值中,该值通常为id
简而言之,它有效地做到了这一点:
#{@post.class.downcase}_path(@post.to_param)
结果是:
post_path(1)
当调用该方法时,您将得到以下小字符串:
"/posts/1"
可爱
这称为多态路由。您可以将对象传递给方法,如redirect\u to
、link\u to
和form\u for
,它将
尝试找出要使用的内容的正确URL
表的形式
现在,当您编写Rails代码时,您可能很久以前就使用了form_来编写这样的代码:
<% form_for @post, :url => { :controller => "posts", :action => "create" } do |f| %>
就我个人而言,我认为没有理由不。。。如果是这么简单的事情。form\u for
方法在下面使用url\u for
,就像
将_重定向到
以确定表单应该放在哪里。它知道@post
对象属于post
类(我们假设也是这样),并且
检查对象是否持久化。如果是,那么它将使用post\u路径(@post)
。如果不是,则posts\u path
form\u for
方法本身检查传入的对象是否也被持久化,如果是,则默认为PUT
HTTP
方法,否则为POST
因此,这就是form_for
灵活到可以在new
和edit
视图上使用相同语法的方式。越来越
如今,人们甚至将标签的整个表单放在一个单独的部分中,并将其包含在新的和
编辑
页面
更复杂的形式
因此,当你传递一个普通对象时,
的form_相当简单,但是如果你传递一个对象数组会发生什么呢?像这样,为了
实例:
<%= form_for [@post, @comment] do |f| %>
调用该方法会导致以下结果:
"/posts/1/comments"
最好的部分<如果@comment
对象不是持久化对象,则的form_仍然知道使用POST
,如果是持久化对象,则知道使用PUT
。好的
需要记住的是,
的表单_始终用于数组中指定的最后一个对象。它之前的对象只是它的
筑巢,仅此而已
添加的对象越多,url\u for
的次数就越多,就越难找到路径。。。尽管我建议
你只需要把它分成两部分
象征性的形式
现在我们已经使用了一个包含对象的数组,用于<代码> Frime> ,让我们看看另一个常用的用法。包含
至少有一个符号对象,如下所示:
redirect_to :controller => "posts", :action => "show", :id => @post.id
redirect_to post_path(@post)
redirect_to @post
def persisted?
!(new_record? || destroyed?)
end
post_comments_path(@post)
<%= form_for [:admin, @post, @comment] do |f| %>
哪些(通常)会转入此路径:
/admin/posts/1/comments/2
对于
方法,您可以将多态路由的数组形式与重定向到
、链接到
和形式一起使用。可能还有其他原因
我现在不记得的方法也能做到这一点。。。通常,Rails中的任何东西都会使用URL
无需使用哈希在任何Rails版本(大于2)中构建URL;那真是太棒了