Mark Hustad
Mark Hustad

Reputation: 169

Delete subscription with a form Rails 4

I'm trying to have subscribers unsubscribe via a delete form where they enter their email and then submit and then delete the subscription. Not sure why this isn't working. I've tried a number of things via my controller. Would love some suggestions or alternatives.

Currently getting this error

Couldn't find Subscription without an ID

Subscriptions controller

def destroy
    @subscriptions = Subscription.all
    @subscription = @subscriptions.find(params[:id])
    if @subscription.email == params[:email]
    @subscription.destroy
            flash[:notice] = "You have been unsubscribed"
            redirect_to root_path
        else
    end
end

Routes

 Rails.application.routes.draw do
 get 'password_resets/new'

  get 'password_resets/edit'

  get 'sessions/new'

  get 'users/new'

  resources :posts
  root 'static_pages#new_home'

  resources :subscriptions, only: [:new, :create, :edit, :update, :show, :destroy]

  get '/home' =>  'static_pages#home'
  get 'subscriptions' => 'subscriptions#show'
  delete 'subscriptions' => 'subscriptions#destroy'
  get '/about' => 'static_pages#about'
  get '/author' => 'static_pages#author'
  get '/contact' => 'static_pages#contact'
  get '/book' => 'static_pages#book'
  get '/signup' => 'users#new'
  get 'login' => 'sessions#new'
  post 'login' => 'sessions#create'
  delete 'logout' => 'sessions#destroy'

  resources :users
  resources :account_activations, only: [:edit]
  resources :password_resets, only: [:new, :create, :edit, :update]

  resources :posts do
    resources :comments
  end
end

Unsubscribe partial in subscriptions view

<%= form_for @subscription, method: :delete do |f| %>


<div class="row">
    <h2>Unsubscribe</h2>
</div>
<div class="row newsletter">
    <form method="post" action="#" class="contact-form">
        <div class="row email-label">
        <%= f.label :email, :class => 'label-email' %>
        <%= f.email_field :email %>
        </div>
        <div class="row">
        <%= f.submit 'Unsubscribe', :class => 'btn-full-subscribe' %>
      </div>
    </form>
</center
<% end %>

I've tried a number of things with no luck. Help would be appreciated. Thanks. Subscriptions are not related to User model.

Upvotes: 0

Views: 128

Answers (2)

Anna88
Anna88

Reputation: 355

Problem is here

@subscription = @subscriptions.find(params[:email])

because find uses id to fetch the record if you want to fetch by any other field use find_by_"attribute_name", Replace it with

@subscription = Subscription.find_by_email(params[:email])

Or no need to write down extra code. No need to fetch all the subscriptions. To delete use

@subscription = Subscription.find_by_email(params[:email])
or
@subscription = Subscription.find(params[:id])

if @subscription.destroy
  flash[:notice] = "You have been unsubscribed"
  redirect_to root_path
end

Upvotes: 0

fbelanger
fbelanger

Reputation: 3578

This line @subscription = @subscriptions.find(params[:email]) is causing the issue.

Try @subscription = @subscriptions.find_by_email(params[:email]) or better yet, use the id @subscription = @subscriptions.find(params[:id]).

ActiveRecord::find only uses ids: http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find.

Upvotes: 1

Related Questions