简体   繁体   中英

Rails/devise app not working properly on Heroku due to new_user_registration_path

Hope one of you can help me out on this one, since I've been breaking my head on it for a while.

I deployed my app to Heroku after trying it out on the cloud9 preview. The problem is that whenever I try to press the button to create a account for a paid subscription, I don't get linked to the page to fill in my credentials. However, on cloud9 this seems to be working fine.

I found the the sole difference between the two by hovering over the same buttons on the different platforms with my mouse.

On cloud9 I get: https://xxxxxxxx-xxxxx.xxxxxxx.xx/users/sign_up?plan=1

On Heroku I get: https://xxxxxxxx-xxxx-xxxxx.herokuapp.com/sign_up

So whenever I click the one on Heroku, I get my build-in flash message saying: Please select a membership plan to sign up!

To be more specific whereas the problem lies according to me, I think it's somewhere in the home.html.erb where the variable gets passed through. (added below)

So it seems that the routing isn't working correct on my Heroku, but I just can't figure out why. I've added my files below.

Hope someone can help me out on this one! Kind regards.

Gemfile

source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'
# Use sqlite3 as the database for Active Record
gem 'sqlite3', group: [:development, :test]
# Use postgresql as the database for production
group :production do
  gem 'pg'
  gem 'rails_12factor'
end
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc

# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug'
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> in views
  gem 'web-console', '~> 2.0'

  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
end

### ADDED GEMS ###

# Bootstrap Gem
gem 'bootstrap-sass', '~> 3.3.6'

# Devise Gem
gem 'devise'

# Font Awesome
gem 'font-awesome-rails'

# Use stripe for handling payments
gem 'stripe'

# Use figaro to hide secret keys
gem 'figaro'

ruby '2.3.0'

routes.rb

Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'users/registrations' }
  resources :users do
    resource :profile
  end
  resources :contacts
  get '/about' => 'pages#about'
  root 'pages#home'
end

pages_controller.rb

class PagesController < ApplicationController
  def home
    @trial_plan = Plan.find_by id: '1'
    @pro_plan = Plan.find_by id: '2'
  end

  def about
  end
end

users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :select_plan, only: :new

  def create
    super do |resource|
      if params[:plan]
        resource.plan_id = params[:plan]
        if resource.plan_id == 2
          resource.save_with_payment
        else
          resource.save
        end
      end
    end
  end

  private
    def select_plan
      unless params[:plan] && (params[:plan] == '1' || params[:plan] == '2')
        flash[:notice] = "Please select a membership plan to sign up."
        redirect_to root_url
      end
    end
end

application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>Ayris</title>
  <%= stylesheet_link_tag    'application', media: 'all' %>
  <%= javascript_include_tag "https://js.stripe.com/v2/", type: 'text/javascript' %>
  <%= javascript_include_tag 'application' %>
  <%= tag :meta, :name => "stripe-key", :content => STRIPE_PUBLIC_KEY %>
  <%= csrf_meta_tags %>
</head>
<body>
...
      <%= link_to root_path, class: 'navbar-brand' do %>
        <i class="fa fa-users"></i>
        Ayris
      <% end %>
        ...
        <% if user_signed_in? %>
          ...
        <% else %>
          ...
        <% if user_signed_in? %>
          ...
        <% end %>
        <li><%= link_to "About", about_path %></li>
        <li><%= link_to "Contact Us", new_contact_path %></li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div>
</nav>

<div class="container">
  <% flash.each do |key, value| %>
    <%= content_tag :div, value, class: "alert alert-#{key}" %>
  <% end %>

  <%= yield %>
</div>

</body>
</html>

home.html.erb

  <% if user_signed_in? %>
    ...
        <% if current_user.profile %>
          ...
        <% else %>
          ...
        <% end %>
     ...
  <% else %>
    <div class="col-md-6">
      <div class="well">
        <h2 class="text-center">Trial Membership</h2>
        <h4>Sign up for free and get trial access for a period of 10 days.</h4>
        <br/>
        <%= link_to "Sign up for Trial", new_user_registration_path(plan: @trial_plan), class: 'btn btn-primary btn-lg btn-block' %>
      </div>
    </div>
    <div class="col-md-6">
      <div class="well">
        <h2 class="text-center">Pro Membership</h2>
        <h4>Sign up for the pro account for €75/month and get access to all functions.</h4>
        <%= link_to "Sign up for Pro", new_user_registration_path(plan: @pro_plan), class: 'btn btn-success btn-lg btn-block' %>
      </div>
    </div>
  <% end %>
</div>

I fixed the problem, the thing you've mentioned about the database was right. The problem was that, for some reason, the db migration to Heroku was unsuccessful, without giving me any notice about it. After running:

Heroku run rails c
Plan.create(name: 'trial', price: 0)
Plan.create(name: 'pro', price: 75)

After running these commands the both plans were injected to the database of my Heroku app. My code seems to work perfectly fine now, altough I've changed the following piece of code according to your comment about hardcoding ID's

pages_controller.rb

class PagesController < ApplicationController
  def home
    if Plan.find_by name: 'trial'
      @trial_plan = 1
    end
    if Plan.find_by name: 'pro'
      @pro_plan = 2
    end
  end
end

Thanks for the heads up.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM