2016-02-28 2 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 

I хотите знать, как принимается решение form_for?

+0

Что такое '@ user' здесь? Также обновите свой вопрос с помощью кода 'routes.rb' – Pavan

+0

Я немного обновил свой код и предоставил код route.rb. –

ответ

1

Пожалуйста, ознакомьтесь с руководством по поддержке формы Rails, в частности, на странице dealing with model objects. Также, docs для form_for.

К вашему вопросу, в

<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 

Как Joe Half Face ссылается на его ответ, :session - symbol, и поэтому form_for разрешает login_path просто action="/login".

Если :session, вместо этого, была переменная экземпляра (давайте представим, у вас есть Session класс и переменную экземпляра, как @session), то ваш form_for вызов, возможно, выглядел примерно так:

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

затем form_for разрешил бы action= по-разному, в зависимости от состояния объекта @session (это новая запись? уже сохраненная запись? и т. д.).

BTW, 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 по умолчанию будет сообщением, Rails соответствует входящему запросу поста с 'login' => 'session#create'.

Метод login_path является автоматически определяется как вы предоставляете строку 'login', если не указано что-то другое, как пост 'login' => 'session#create', as: "sign_in", который будет делать sing_in_path.

Это часть Rails назад метапрограмм.

+0

Спасибо u ** Joe Half Face **, но все еще есть сомнения, что если файл route.rb тот же, и код выглядит следующим образом: - <% = form_for (@user) do | f | %> **, что я вижу, это то, что этот код переводится на ** action = "/ users", просто любопытно узнать, как в этом случае без предоставления пути является form_for выяснения действия, которое должно быть выполнено. Здесь @user - это объект модели базы данных, в основном эта форма используется для создания страницы регистрации. –

Смежные вопросы