Неопределенная локальная переменная или метод `e' внутри контроллера подписки

Я получаю следующую ошибку в своем приложении Rails 4.2. Я пытаюсь настроить подписки с помощью Stripe. Подписка принадлежит компании и имеет план_one. Ошибка, которую я получаю, приведена ниже, и мой код следует. Простите меня, если это вопрос новичка.

NameError

Контроллер подписок

class SubscriptionsController < ApplicationController
  before_action :set_subscription, only: [:show, :edit, :update, :destroy]

  # GET /subscriptions
  def index
    @subscriptions = Subscription.all
  end

  # GET /subscriptions/1
  def show
  end

  # GET /subscriptions/new
  def new
    @subscription = Subscription.new
    @plan = Plan.find_by id: params["plan_id"]
    @business = Business.find_by id: params["business_id"]
  end

  # POST /subscriptions
  def create
    @subscription = Subscription.new subscription_params.merge(email: stripe_params["stripeEmail"],
                                                               card_token: stripe_params["stripeToken"])
    raise "Please, check subscription errors" unless @subscription.valid?
    @subscription.process_payment
    @subscription.save
    redirect_to @subscription, notice: 'Subscription was successfully created.'
  rescue
    flash[:error] = e.message
    render :new
  end

  private
    def stripe_params
      params.permit :stripeEmail, :stripeToken
    end
    # Use callbacks to share common setup or constraints between actions.
    def set_subscription
      @subscription = Subscription.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def subscription_params
      params.require(:subscription).permit(:plan_id, :business_id)
    end
end

Модель подписки

class Subscription < ActiveRecord::Base

  belongs_to :business
  has_one :plan

  def process_payment
    customer = Stripe::Customer.create email: email,
                                       card: card_token

    Stripe::Charge.create customer: customer.id,
                          amount: plan.price * 100,
                          description: plan.name,
                          currency: 'usd'

  end

end

Просмотр подписки (new.html.erb)

<%= form_for @subscription do |f| %>
  <% if @subscription.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@subscription.errors.count, "error") %>
        prohibited this subscription from being saved:
      </h2>
      <ul>
        <% @subscription.errors.full_messages.each do |message| %>
          <li>
            <%= message %>
          </li>
        <% end %>
      </ul>
    </div>
  <% end %>
  <h1><%= @business.name %></h1>
  <div class="field">
    <%= f.hidden_field :plan_id, value: @plan.id %>
  </div>
  <div class="field">
    <%= f.hidden_field :business_id, value: @business.id %>
  </div>
  <div class="actions">
    <script
      src="https://checkout.stripe.com/checkout.js" class="stripe-button"
      data-key="<%= Rails.application.secrets.stripe_publishable_key %>"
      data-image="/img/documentation/checkout/marketplace.png"
      data-name="Business Name"
      data-description="<%= @plan.name %>"
      data-amount="<%= @plan.price*100 %>">
    </script>
  </div>
<% end %>

Модель плана

class Plan < ActiveRecord::Base

  belongs_to :subscription

end

ИЗМЕНИТЬ

...
rescue Exception => e
  flash[:error] = e.message
  render :new
...

Я сделал вышеуказанное изменение, и теперь я вижу эту ошибку?

введите здесь описание изображения


person Justin Seidl    schedule 10.07.2015    source источник
comment
Где вы определили e?   -  person steve klein    schedule 10.07.2015
comment
Вам не хватает Exception => e   -  person Pavan    schedule 10.07.2015
comment
@Pavan есть идеи, почему я получаю новый выпуск?   -  person Justin Seidl    schedule 10.07.2015
comment
@steveklein, вы случайно не знаете, почему я получаю новую ошибку?   -  person Justin Seidl    schedule 10.07.2015
comment
Я никогда не видел такого синтаксиса для find_by и не могу заставить его правильно работать в моей консоли Rails. Если вы проезжаете plan_id в своем params со своего маршрута, почему бы просто не использовать @plan = Plan.find(params["plan_id"])?   -  person steve klein    schedule 11.07.2015
comment
@steveklein все та же ошибка ... Когда я перехожу на новую страницу, сначала присутствуют идентификатор бизнеса и плана, когда я отправляю свою форму, я получаю следующую ошибку, если это помогает.   -  person Justin Seidl    schedule 11.07.2015
comment
Вы действительно должны опубликовать это как новый вопрос.   -  person steve klein    schedule 11.07.2015
comment
@steveklein Я разместил здесь новый вопрос: stackoverflow.com/questions/31350606/   -  person Justin Seidl    schedule 11.07.2015


Ответы (1)


Как говорится undefined method id for nil class. Ваш @plan равен нулю, пуст. Вероятно, потому что вы не получаете никаких параметров в этой строке @plan = Plan.find_by id: params["plan_id"].

Если вы не передаете plan_id, используя что-то вроде URL-запроса или публикации откуда-то, это не сработает.

Ваш код говорит, что plan belongs_to subscription, поэтому либо вы выбираете plan внутри новой формы подписки, либо передаете параметр, как я сказал выше.

Как видно из изображения, доступ к хешу params может получить params[:subscription][:plan_id].

person MurifoX    schedule 10.07.2015
comment
Я думал, что передаю параметры plan_id и business_id, на втором изображении, которое я включил внизу, оно гласит: subscribe=›{plan_id=›2, business_id=›1001}, - person Justin Seidl; 10.07.2015
comment
@JustinSeidl plan_id находится внутри subscription. Таким образом, вы должны получить доступ с помощью params[:subscription][:plan_id]. - person MurifoX; 12.07.2015