Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-链接到、路由和嵌套资源_Ruby On Rails_Routes_Nested Resources - Fatal编程技术网

Ruby on rails 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)

正如我对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) 欲了解更多详情,请访问:


与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;那真是太棒了