新手问题 看 Rails Guides 的新手问题 :posts_path 与 create 动作的对应

bigpig85 · 2013年09月29日 · 最后由 pokrpokr 回复于 2016年02月04日 · 4894 次阅读

新手问题,在看RoR guides,在访问localhost:3000/posts/new的时候,如果点击提交后会转到create动作,我想知道这个点击后转到create动作是在哪里写的?是form_for后面的 :post来定义的吗?这个跟create动作是怎么关联的呢?

In this example, the posts_path helper is passed to the :url option. What Rails will do with this is that it will point the form to the create action of the current controller, the PostsController, and will send a POST request to that route

<%= form_for :post, url: posts_path do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

rake routes的输出:

   Prefix Verb   URI Pattern               Controller#Action
    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
     root GET    /                         welcome#index
共收到 17 条回复

posts_controller裡面寫啊

是由form_for来确定的,form_for :post 会默认生成向/posts提交的表单,而POST /posts这个route对应的就是posts#create方法。form_for :post, url: posts_path则是使用url参数指定了提交表单的地址为posts_path,你也可以指定其它的地址。

routes.rb 里面 resource 默认带了的

#2楼 @edgar_wang_cn 多谢回复,那这里form_for后面的:post和route中的POST /posts是怎么对应的呢?

#2楼 @edgar_wang_cn 是可以在form_for后面跟要使用的方法吧,比如默认是指向:post的,就是会指向/POST,如果我在后面加上method: :post跟不加的效果一样,如果加上:patch就是指向了PATCH,也就是update方法,如果加上:delete,就是指向了DELETE也就是控制器中的destroy方法了对吧

<%= form_for :post, url: posts_path, method: :post do |f| %>

#5楼 @bigpig85 基本上是对的。不过在你使用符号形式(即form_for :post)时,你要注意methodurl的对应关系,比如POST /posts对应create方法,而PATCH /posts/:id对应于update方法,updatedestroy之类的方法需要指定对象来操作。你可以自己改动几次看看具体效果。推荐你去看看这个 http://guides.rubyonrails.org/form_helpers.html

#6楼 @edgar_wang_cn 是的,今天试了,对于update和destroy方法需要指定对象

<%= form_for :post, url: post_path(@post.id), method: :patch do |f| %>

感谢指点~

#7楼 @bigpig85 直接使用<%= form_for @post do |f| %>这种形式也可以。

#8楼 @edgar_wang_cn 是呀,后面我看到用了partials后,在_form.html.erb中就是这么写的,这么又怎么理解呢?

#9楼 @bigpig85 它跟form_for :post这种形式是类似的,不过form_for可以通过判断实例对象@post是否已存在于数据库中来确定urlmethod,所有就不需要特别指定urlmethod了。

#6楼 @edgar_wang_cn 请问我不用那7条资源路由 ,要让这个表单提交时走自己创建的路由,我该怎么设置路由,<%= form_for :post, url: membersadd do |f| %> , membersadd 这个路由我要怎么设置

@yty 你可以用

post 'membersadd' => 'members#create'

这种写法,后面的members#create要根据你的controller自行设定,然后就可以把url设为membersadd_path了。

#12楼 @edgar_wang_cn 我想问下,我也是卡在这里了,post_path不是对应get和post么,那么为什么是自动默认为是用post方法呢,如果可以手动设置,是按照上边说的,加上method::get这样使用get方法?

#13楼 @pokrpokr posts_path对应的是/posts(.:format)这个URL,最终这个form执行GET还是POST依赖form_for生成的form里的method是GET还是POST。可以用method: :get使生成的表单使用GET提交数据。

#14楼 @edgar_wang_cn 那也就是说一般默认为post方法?

#15楼 @pokrpokr HTML默认的form是GET,form_for好像默认生成的是POST方法的form。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册