Rails路由用于创建,删除,更新操作

时间:2016-04-11 19:19:09

标签: ruby-on-rails url-routing

我正在尝试了解rails路由。我看过导轨指南,但我仍然感到困惑。例如,我有一个posts_controller,其中包含所有rails crud操作,如下所示:

                    posts GET    /posts(.:format)                     posts#index
                          POST   /posts(.:format)                     posts#create
                 new_post GET    /posts/new(.:format)                 posts#new
                edit_post GET    /posts/:id/edit(.:format)            posts#edit
                     post GET    /posts/:id(.:format)                 posts#show
                          PATCH  /posts/:id(.:format)                 posts#update
                          PUT    /posts/:id(.:format)                 posts#update
                          DELETE /posts/:id(.:format)                 posts#destroy

从上面我可以看到,只有index, new, edit and show个动作在左侧有一个路径名。例如,index操作的路径名为posts,我可以将网址设为posts_path。我可以在链接标签中使用它,如下所示

<a href="<%= posts_path %>">here</a>

但是没有用于创建,更新和销毁操作的路径名。那么如何在这种情况下为下面的链接获取创建操作的URL?

<a href="<%= ..... link to create action of post controller  %>">here</a>      

4 个答案:

答案 0 :(得分:4)

传递路径以及您要删除的帖子的ID或您要创建的对象:

<%= link_to posts_path(@post) %>

如果您在某个表单中,并且有一个对象(@ post = Post.new),则rails会根据您使用该路由提交的内容知道您要创建的内容表单。如果您想使用link_to删除,则需要传递method: :delete

答案 1 :(得分:2)

您需要使用link_to method中的method属性。路由名称相同,但只是使用不同的HTTP谓词:

<%= link_to "Update Post", post_path, method: :patch %>

答案 2 :(得分:2)

所以在所有生成的路由上都有_path帮助器,我在下面生成的路由前面添加了路径名,我稍后会解释其中的区别:

                posts GET    /posts(.:format)                     posts#index
                posts POST   /posts(.:format)                     posts#create
             new_post GET    /posts/new(.:format)                 posts#new
            edit_post GET    /posts/:id/edit(.:format)            posts#edit
                 post GET    /posts/:id(.:format)                 posts#show
                 post PATCH  /posts/:id(.:format)                 posts#update
                 post PUT    /posts/:id(.:format)                 posts#update
                 post DELETE /posts/:id(.:format)                 posts#destroy

因此,您对服务器的任何GET请求都可以使用给定的路径完成(因为GET是任何访问链接的默认值),但您仍然可以通过显式声明方法使用_path帮助程序来访问其他路由您正在使用的访问权限。例如:

Index:
   <%= link_to "Index", posts_path %>

Create:
   <%= link_to "Create", posts_path, method: 'POST' %>

New:
   <%= link_to "New", new_post_path %>

Edit:
   <%= link_to "Edit", edit_post_path(post_id) %>

Show:
   <%= link_to "Show", post_path(post_id) %>

Update:
   <%= link_to "Update", post_path(post_id), method: 'POST' %>
   <%= link_to "Update", post_path(post_id), method: 'PATCH' %>

Destroy:
   <%= link_to "Destroy", post_path(post_id), method: 'DELETE' %>

答案 3 :(得分:1)

我向你推荐这个讲座,对我来说,帮助我理解这一点很有帮助。但基本上你需要发送方法put,patch或delete Routes in rails explainpatch and put for rails

<%= link_to "Update Post", posts_path(@post.id), method: :patch %>
<%= link_to "Update Post", posts_path(@post.id), method: :put %>
<%= link_to "delete Post", posts_path(@post.id), method: :delete%>

不要忘记id很重要,因为你的控制器需要知道哪些帖子需要进行更新或删除操作。