2011-01-04 3 views
0

Я создаю небольшое приложение для рассылки новостей с «двойными ограничениями доступа», когда я просто заполняю свою форму (страницу подписки) и отправляю форму, которую я перенаправляю на свою подписку страница (что все нормально), однако моя форма добавляет строку запроса на мой атрибут действия моей формы (HTTP: // локальный: 3000/бюллетень/подписка формат =)RoR appended? Format = on form submit

маршруты:

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

ответ

4

Попробуйте удалить аргумент @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. Вы можете удалить это.