RoR добавлен? Format = при отправке формы - PullRequest
0 голосов
/ 05 января 2011

Я создаю небольшое приложение для новостной рассылки с «двойным ограничением доступа», когда я просто заполняю свою форму (страницу подписки) и отправляю форму, которую я перенаправляю на мою страницу подписки (что все нормально) моя форма добавляет строку запроса к моему атрибуту действия моей формы (http://localhost:3000/newsletter/subscribe?format=)

маршруты:

  match 'newsletter/subscription' => 'newsletter_subscriptions#subscription'
  post 'newsletter/subscribe' => 'newsletter_subscriptions#subscribe'

контроллер:

class NewsletterSubscriptionsController < ApplicationController
  respond_to :html

  # GET /newsletter/subscription
  def subscription
    respond_with (@subscription = NewsletterSubscription.new)
  end

  # POST /newsletter/subscribe
  def subscribe

    # If there's already an unconfirmed record with the submitted email, use that object otherwise create a new one based on the submitted email
    sub_new       = NewsletterSubscription.new
    sub_new.email = params[:newsletter_subscription]['email']
    sub_old       = NewsletterSubscription.find_by_email_and_confirmed sub_new.email, 0
    @subscription = sub_old || sub_new

    if @subscription.save
      Newsletter.delay.subscribed(@subscription) # with delayed_job
    else
      render :action => "subscription"
    end
  end

  ...

end

просмотр (newsletter_subscription / subscription.html.erb):

<h1>New newsletter_subscription</h1>
<%= form_for(@subscription, :url => newsletter_subscribe_path(@subscription)) do |f| %>
    <% if @subscription.errors.any? %>
        <div id="error_explanation">
          <h2><%= pluralize(@subscription.errors.count, "error") %> prohibited this newsletter_subscription from being
            saved:</h2>
          <ul>
            <% @subscription.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
          </ul>
        </div>
    <% end %>

    <div class="field">
      <%= f.label :email %>
      <br/>
      <%= f.text_field :email %>
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
<% end %>

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

1 Ответ

3 голосов
/ 05 января 2011

Попробуйте удалить аргумент @subscription, который вы передаете в newsletter_subscribe_path. Поскольку в маршруте нет :id и это новый объект, проходить его не имеет смысла. Я предполагаю, что это то, что интерпретируется как формат.

<%= form_for(@subscription, :url => newsletter_subscribe_path) do |f| %>

Что касается улучшений, которые вы можете внести в код, самое большое, что я вижу, это перемещение старой / новой логики подписки в модель.

# in NewsletterSubscription
def self.with_email(email)
  find_by_email_and_confirmed(email, 0) || new(:email => email)
end

# in controller
@subscription = NewsletterSubscription.with_email(params[:newsletter_subscription]['email'])
if @subscription.save
#...

Также respond_to и respond_with здесь на самом деле не нужны, так как вы имеете дело только с представлениями HTML. Вы можете удалить это.

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