Как создать эту форму Ruby on Rails? - PullRequest
1 голос
/ 19 июля 2010

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

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

Существует также NewsletterController и модель Newsletter. Дело в том, что я хотел сохранить свой контроллер одним простым методом, 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 ]

2 голосов
/ 19 июля 2010

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

Например:

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

EDIT:

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

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

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

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

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

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

  POST to /newsletter_signup
DELETE to /newsletter_signup/1

Отображение сообщения

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

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

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

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

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

2 голосов
/ 19 июля 2010

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

Форма создания может выглядеть примерно так:

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

ОБНОВЛЕНИЕ : Предоставление дополнительного цвета по запросу спрашивающего:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...