Полоса: ActionController::UrlGenerationError | Нет совпадений маршрутов | отсутствуют необходимые ключи: [:id]

Я только изучаю RoR, и мне нужно, чтобы у меня возникли проблемы с интеграцией Stripe. Я сделал все, как написано здесь, за исключением того, что я изменил "сборы" на "сборы. "

Я получаю сообщение об ошибке: No route matches {:action=>"show", :controller=>"charge"} missing required keys: [:id].

Это не позволяет мне сделать: <%= form_tag charge_path do %>

Это мой контроллер:

class ChargeController < ApplicationController
def new
end

def create

# Amount in cents
@amount = 0

customer = Stripe::Customer.create(
:email => '[email protected]',
:card  => params[:stripeToken]
)

charge = Stripe::Charge.create(
:customer    => customer.id,
:amount      => @amount,
:description => 'Inspire App Charge',
:currency    => 'usd'
)

rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to charge_path
end
end

В моем файле route.rb есть: resources :charge

Спасибо за помощь!


person Jon K.    schedule 08.12.2013    source источник
comment
После того, как вы изменили «Charges» на «Charge», вы нарушаете соглашение об именах RoR.   -  person Aleksei Matiushkin    schedule 08.12.2013


Ответы (2)


Вы не должны отклоняться от стандартов Rails, это в большинстве случаев накажет вас за это. Вы должны переименовать свой контроллер обратно в ChargesController и взглянуть на "Singular Resources" о том, как вы можете решить свою проблему.

Итак, изменения, которые вам нужны для устранения ваших проблем, следующие:

  1. Переименовать app/controllers/charge_controller.rb в app/controllers/charges_controller.rb
  2. Переименовать class ChargeController в class ChargesController
  3. Замените resources :charge на resource :charge

Заменив resources :charge на resource :charge, вы создадите единый зарядный ресурс с путем /charge.

С вашей текущей настройкой, т. е. resources :charge, вы увидите следующее (это не то, что вам нужно):

charge_index   GET    /charge(.:format)              charge#index
               POST   /charge(.:format)              charge#create
new_charge     GET    /charge/new(.:format)          charge#new
edit_charge    GET    /charge/:id/edit(.:format)     charge#edit
charge         GET    /charge/:id(.:format)          charge#show
               PUT    /charge/:id(.:format)          charge#update
               DELETE /charge/:id(.:format)          charge#destroy

Как вы можете видеть выше, charge_path разрешается в charge#show, но если вы посмотрите на путь, он также требует параметра :id, который вы не указываете в своем вызове form_tag :charge_path.

person vee    schedule 08.12.2013

Вам нужно изменить имя вашего контроллера на ChargesController, изменить помощник пути на charges_path и маршруты на resources :charges.

Кроме того, форма должна быть POSTing.

person Finbarr    schedule 08.12.2013