开发者

RoR appended ?format= on form submit

I'm creating a little newsletter application, with 'double opt-in restrictions', when I simply fill in my form (subscription page) and submit the form I get redirected to my subscribed page (which is all normal) however my form appends a querystring to my action attribute of my form (http://localhost:3000/newsletter/subscribe?format=)

routes:

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

controller:

class NewsletterSubscriptionsController < ApplicationController
开发者_Go百科  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

view (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: I would be pleased if someone could evaluate my ruby code please (posted above), I'm still learning a lot and would like to see some 'guidelines' or feedback, I think I still can learn a lot.


Try removing the @subscription argument you're passing into newsletter_subscribe_path. Since there isn't an :id in the route and it's a new object, passing it doesn't really make sense. I'm assuming that's what is being interpreted as the format.

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

As for improvements you can make to the code, the biggest thing I see is moving the old/new subscription logic into the model.

# 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
#...

Also respond_to and respond_with aren't really necessary here since you're just dealing with HTML views. You can remove that.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜