2014-01-16 4 views
1

Я следую this official guide, чтобы узнать о Rails, где построен блог, и я заметил, что он не кажется полным.Использование партитуры в Rails

On Point 5.13 «Использование частичных элементов для очистки дублирования в представлениях», рекомендуется принять форму для создания сообщения и отредактировать его внутри частичного, потому что оба они похожи. Он говорит о небольшой разнице в маршрутах, используемых обеими формами, но говорит, что это проблема, которая будет объяснена позже.

Все, кроме объявления form_for, остается неизменным. Как form_for может определить правильные атрибуты действия и метода при создании формы, будет объяснено всего лишь мгновение. [...]

Но я заметил, что руководство никогда не объясняет, как это сделать. (Может быть, они просто забыли ...?)

Может кто-нибудь объяснить мне, как я могу решить эту проблему?

ответ

1
<%= form_for @product do |f| %> 
. 
. 
. 
<% end %> 

Когда @product является новой записью, Rails знает об этом и использует products_path. Однако, когда @product существует один, Rails использует product_path (@product).

5

Если вы следуете соглашениям Rails, вам не нужно ничего делать. Это хорошо объяснено в документации (http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for).

Однако дальнейшее упрощение возможно, если запись передается form_for является ресурсом, то есть она соответствует набору RESTful маршрутов, например, определяемый с использованием метода ресурсов в config/routes.rb. В этом случае Rails просто выведет соответствующий URL из самой записи .

В принципе, вам нужно:

  1. Использование form_for помощник
  2. Pass модель объекта к нему (вместо символа)
  3. Определили ресурс в routes.rb F.I. resources :posts

Так что если у вас есть form_for(@post), Rails определит, какой маршрут использовать, проверяя, если @post новый рекорд.

Если вы хотите полный пример, просто создать новые рельсы приложение и создать любой эшафот:

rails g scaffold User name

Вы можете проверить, что Rails положил форму в частично: app/views/users/_form.html.erb.

Если вы хотите глубоко выкопать, проверьте исходный код. Интересная часть находится в this file.

action, method = object.respond_to?(:persisted?) && object.persisted? ? [:edit, :patch] : [:new, :post] 

В нашем примере @post присваивается object.Rails полон таких коротких сокращений, и иногда лучший способ узнать о них - это смотреть на исходный код. Если вы хорошо знаете Ruby, вы часто найдете исходный код лучшим объяснением того, что документы и руководства.

1

Это не очень помогает объяснить это. Если вы посмотрите страницу в двух версиях формы, один для new и один для edit, вы увидите, что у них есть два разных фрагмента кода после form_for, но они оба передают переменную @post. В первом случае переменная содержит новый пустой объект Post.

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

В версии edit он смотрит запись, поставив его в переменной @post и передать его в форму.

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

Окончательный вариант, частичное, не имеет дополнительный код, указывающий, если это new действие или edit. Но из-за URL-адреса и действия, вызывающего представление, Rails знает, какой код подпадает в форму при использовании частичной формы. Подробнее «Rails magic».

<%= form_for @post do |f| %> 
Смежные вопросы