2010-07-18 4 views
1

У меня есть маршрут, который выглядит следующим образом:Как создать форму Ruby on Rails?

map.newsletter '/newsletter', :controller => "newsletter" , :action => "newsletter_signup" 

Там также является NewsletterController и модель Информационного бюллетеня. Дело в том, что я хотел оставить свой контроллер до одного простого метода, newsletter_signup. Там я просто проверяю, есть ли запрос типа post или типа get. Если это получается, я просто вернусь к статическому html-представлению с благодарностью за подписку на наш информационный бюллетень. Если это сообщение, я хочу создать новую модель информационного бюллетеня и подписать пользователя. В идеале я хотел бы встроить эту форму в свою домашнюю страницу, которая не называется контроллером рассылки новостей. Я не думал, что такие URL-адреса, как http://example/newsletter/1 или http://example/newsletter/new, имеют большое значение, поэтому способ настройки маршрута выше .. только http://example/newsletter работает.

Как я могу создать эту форму? Он принимает одно поле, просто текстовое поле, которое является электронным адресом пользователя. После того, как они попадут в submit, он должен отправить сообщение POST на контроллер информационного бюллетеня и метод newsletter_signup. Поскольку эта форма будет находиться в нижнем колонтитуле каждой страницы моего приложения, мне нужно сделать что-то вроде @newsletter = Newsletter.new в моем контроллере/действии по умолчанию?

ответ

2

Что вы предлагаете не совсем Rails путь но если вы действительно хотите сделать это, ваше действие контроллера имеет доступ к request объекта, на котором вы можете позвонить get? или post? для проверки типа метода. См here для более подробной информации

форма создания может выглядеть следующим образом:

<% form_for(Newsletter.new, :url => { :action => "newsletter_signup" }, :html => { :method => :post}) do |f| %> 
    <%= f.text_field :email_address %> 
    <%= f.submit "Signup" %> 
<% end %> 

UPDATE: Обеспечение дальнейшего цвета по желанию вопрошающего в:

Правда я немного неясно о своем различии вы между подпиской на информационный бюллетень (что вы хотели получить) и пение с POST. Это то, что ваше приложение также позволяет пользователям подписываться на услугу, отличную от рассылки?

Идиоматически POST/PUT/DELETE используются при изменении базы данных и GET для операции чтения. Мне кажется, что оба типа регистрации - это запись в базу данных (т. Е. Где-то где-то нужно хранить адрес электронной почты и информацию о пользователе).

Я думаю, вам нужно всего лишь create действие (POST) в NewslettersController для подписки на рассылку новостей. Регистрация может заключаться в добавлении адреса в таблицу news_letters, которая требует создания и сохранения модели NewsLetter промежуточного шага.

Регистрация пользователей (если я правильно понял это), я предполагаю, что вы уже ушли. Короче говоря, я думаю, что вы имеете дело с операциями POST для обоих случаев. Не требуется GET. Имеют смысл?

+0

Спасибо за совет. Кстати, я хотел бы сделать это Rails. Работа с каркасом противоречит интуиции. Можете ли вы помочь мне понять, почему то, что я делаю, - это не правильный способ этого? Имеют ли URL-адреса, такие как http: // example/newsletter/5, действительно смысл для подписки на рассылку, где я один раз в месяц отправляю сообщения по электронной почте о обновлениях продукта? – randombits

2

AFAIK, «Rails Way», чтобы использовать это: map.resource или map.resources, и если имена по умолчанию не имеют смысла, вы можете переименовать их с помощью опции :path_names.

Например:

map.resource :newsletter, :only => [:new, :destroy], :path_names => { :new => 'signup', :destroy => 'unsign' } 

EDIT:

Я просто понял, что я пропускаю эквивалент «создать», который будет использоваться на самом деле сделать обновление базы данных (» новый "будет представлять страницу, спрашивая, хочет ли пользователь зарегистрироваться в информационном бюллетене). Поэтому, если вы хотите включить этот вызов в действие, встроенный в другую страницу, тогда «новый» маршрут может не понадобиться.

Создание контроллера и маршрут

В этом случае, мы на самом деле не говорим о бюллетене ресурса, но подписке на рассылку ресурсов. Что будет означать, что контроллер будет называться NewsletterSignup и следующий маршрут будет более подходящим:

map.resource :newsletter_signup, :only => [:create, :destroy] 

Это позволит вам вставлять ссылки/кнопки на существующую страницу, которые посылают запросы подписаться или unsign от рассылки , Действия этих ссылок будут использовать нормальный акт и шаблон перенаправления для выполнения обновлений.

Звенья будет выглядеть примерно так:

POST to /newsletter_signup 
DELETE to /newsletter_signup/1 

выдавалось сообщение

Наконец, Rails способ показать сообщение «Спасибо за подписавшись на рассылку» это с помощью " флэш-сообщение ". Это включает в себя следующий код в создании действия контроллера NewsletterSignup:

flash[:notice] = 'Thanks for signing up to the newsletter!' 

Вы показать это в представлении страницы действие затем перенаправляет обратно (который когда-либо страницы кнопку/регистрацию ссылка была на), который может затем включают следующее сообщение:

<% if flash[:notice] %> 
    <p class="notice"><%= flash[:notice] %></p> 
<% end %> 

Если использующийся обычно фрагмент, как выше, может быть добавлен в макете, так что может быть сделано, чтобы появиться на любой странице.

+0

Да, это хороший способ выражения правила маршрутизации. Я больше думал о предлагаемом использовании GET для обновления таблицы информационных бюллетеней. – bjg

+0

Я просто понял, что я пропустил: создать маршрут тоже, и это было бы тем, что я ожидал бы использовать для обновления таблицы информационных бюллетеней. Новый маршрут предназначен для создания отдельной страницы, на которой будет отображаться кнопка регистрации. –

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