2016-02-28 56 views
3

我写了下面的代码: -form_for如何决定为特定请求采取何种操作?

<%= form_for(:session,url: login_path) do |f| %> 

其被记到

<form action="/login" accept-charset="UTF-8" method="post"> 

的routes.rb文件包含以下代码: -

root 'static_pages#home' 
get 'contact'=>'static_pages#contact' 
get 'about'=>'static_pages#about' 
get 'help' => 'static_pages#help' 
get 'signup' => 'users#new' 
get 'login' => 'sessions#new' 
post 'login' => 'session#create' 
delete 'logout' => 'session#destroy' 
resources:users 

我想知道form_for的动作是如何决定的?

+0

什么是'@ user'这里?同时用'routes.rb'代码更新你的问题 – Pavan

+0

我已经更新了一下我的代码,并提供了routes.rb代码。 –

回答

1

请查阅Rails表单助手指南,特别是关于dealing with model objects.的部分。另请参阅form_for的docs

你的问题,在

<form action="/login" accept-charset="UTF-8" method="post"> 
     ^^^^^^^^^^^^^^^ 
      this bit 

从你传递给form_for帮手

<%= form_for(:session, url: login_path) do |f| %> 
       ^^^^^^^^ 
       here 

随着你(可选)传递到URL的对象的组合来form_for帮手

<%= form_for(:session, url: login_path) do |f| %> 
         ^^^^^^^^^^^^^^^ 
           here 

As Joe Half Face在他的回答中暗示,:sessionsymbol,所以form_for解决login_path简单地到action="/login"

如果:session,相反,一直是个实例变量(让我们设想你有一个Session类,并像@session一个实例变量),那么你的form_for通话可能看起来是这样的:

<%= form_for(@session, url: login_path) do |f| %> 

然后form_for根据@session对象的状态(是新记录还是已保存的记录等),将不同地解决action=

顺便说一句,form_for确实不需要url论点。因此,它的好做:

<%= form_for(@user) do |f| %> 

在这种情况下,form_for使用提供@user对象来推断正确的路径,你会得到

<form action="/users" ... > 
0

如果@user不坚持它推你update行动

如果不坚持 - 以create

,但你可以自己配置form_for

form_for @user, url: {action: "create"} 
2

这里,你不指定实例对象(@model_name),它只是将表单路径分配给您提供的路径:login_path,只输出“/ login”的方法。

有两条路线

get 'login' => 'sessions#new' 
post 'login' => 'session#create' 

但是作为默认的form_for HTTP动词会后,导轨和'login' => 'session#create'传入POST请求匹配。

方法login_path是您提供的字符串'login',除非你指定其他类似岗位'login' => 'session#create', as: "sign_in"的东西,它会做sing_in_path定义汽车。

它是Rails向后元编程的一部分。

+0

感谢您** Joe Half Face **,但仍然存在疑问,如果routes.rb文件相同,代码如下所示: - <%= form_for(@user)do | f | %> **我看到的是,这段代码被转换为** action =“/ users”,只是想知道在这种情况下如何在没有提供路径的情况下使用form_for来确定要执行的操作。这里@user是数据库模型对象,基本上这个表单用于创建注册页面。 –

相关问题