未定义的方法`total' for nil:ReservationsController#checkout中的NilClass NoMethodError

时间:2016-07-16 05:35:01

标签: javascript html ruby-on-rails ruby braintree

我目前无法弄清楚如何从一个控制器获取params以添加到下一个控制器。我试过renderredirect_to,我仍然无法让它工作!!

继承我的控制器和视图 - 视图中的表单获取checkout controller的操作 - 我想在结账和创建控制器中使用相同的reservation.id,所以我可以在结账控制器中调用reservation.total。

如何在创建控制器上获取总数并希望在结帐控制器上共享?

错误日志:

NoMethodError (undefined method `total' for nil:NilClass):
  app/controllers/reservations_controller.rb:45:in `checkout'

预订控制器:

def checkout




nonce = params[:payment_method_nonce]
 result = Braintree::Transaction.sale(
  :amount => @reservation.total,
  :payment_method_nonce => nonce,
  :options => {
    :submit_for_settlement => true
  }
)
 if result.success?
  puts "success!: #{result.transaction.id}"
elsif result.transaction
  puts "Error processing transaction:"
  puts "code: #{result.transaction.processor_response_code}"
  puts "text: #{result.transaction.processor_response_text}"
else
  p result.errors
end


end



def create

#!/usr/bin/env ruby


    reviser = Reviser.find(params[:reviser_id])
        @reservation = current_user.reservations.create(reservation_params)

        if @reservation.total > 0

            @token = Braintree::ClientToken.generate


        elsif @reservation.total == 0
            @reservation.update_attributes status: true
            redirect_to @reservation.reviser.user, alert: "Writing Request Success"


        else
            redirect_to @reservation.reviser, alert: "Oops, something went wrong..."
        end 




    end

创建html:



<p>create</p>


<form id="checkout" method="post" action="/checkout">
  <div id="payment-form"></div>
  <input type="submit" value="Pay">
</form>

<script src="https://js.braintreegateway.com/js/braintree-2.26.0.min.js"></script>
<script>
// We generated a client token for you so you can test out this code
// immediately. In a production-ready integration, you will need to
// generate a client token on your server (see section below).
// var clientToken = "eyJ2ZXJzaW9uIjoyLCJhdXRob3JpemF0aW9uRmluZ2VycHJpbnQiOiI5OGRjMDcyZDFmM2IwNzdlNmI2YmE1NTQ0ZDIxYzQ4YjliZmZlZDA3YmZhNTgxYzRkMTU4MzU2MWIyMjIxYzJlfGNyZWF0ZWRfYXQ9MjAxNi0wNy0xNVQwNjo0OTo0MS4zMTczNjM3NDArMDAwMFx1MDAyNm1lcmNoYW50X2lkPTM0OHBrOWNnZjNiZ3l3MmJcdTAwMjZwdWJsaWNfa2V5PTJuMjQ3ZHY4OWJxOXZtcHIiLCJjb25maWdVcmwiOiJodHRwczovL2FwaS5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tOjQ0My9tZXJjaGFudHMvMzQ4cGs5Y2dmM2JneXcyYi9jbGllbnRfYXBpL3YxL2NvbmZpZ3VyYXRpb24iLCJjaGFsbGVuZ2VzIjpbXSwiZW52aXJvbm1lbnQiOiJzYW5kYm94IiwiY2xpZW50QXBpVXJsIjoiaHR0cHM6Ly9hcGkuc2FuZGJveC5icmFpbnRyZWVnYXRld2F5LmNvbTo0NDMvbWVyY2hhbnRzLzM0OHBrOWNnZjNiZ3l3MmIvY2xpZW50X2FwaSIsImFzc2V0c1VybCI6Imh0dHBzOi8vYXNzZXRzLmJyYWludHJlZWdhdGV3YXkuY29tIiwiYXV0aFVybCI6Imh0dHBzOi8vYXV0aC52ZW5tby5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tIiwiYW5hbHl0aWNzIjp7InVybCI6Imh0dHBzOi8vY2xpZW50LWFuYWx5dGljcy5zYW5kYm94LmJyYWludHJlZWdhdGV3YXkuY29tLzM0OHBrOWNnZjNiZ3l3MmIifSwidGhyZWVEU2VjdXJlRW5hYmxlZCI6dHJ1ZSwicGF5cGFsRW5hYmxlZCI6dHJ1ZSwicGF5cGFsIjp7ImRpc3BsYXlOYW1lIjoiQWNtZSBXaWRnZXRzLCBMdGQuIChTYW5kYm94KSIsImNsaWVudElkIjpudWxsLCJwcml2YWN5VXJsIjoiaHR0cDovL2V4YW1wbGUuY29tL3BwIiwidXNlckFncmVlbWVudFVybCI6Imh0dHA6Ly9leGFtcGxlLmNvbS90b3MiLCJiYXNlVXJsIjoiaHR0cHM6Ly9hc3NldHMuYnJhaW50cmVlZ2F0ZXdheS5jb20iLCJhc3NldHNVcmwiOiJodHRwczovL2NoZWNrb3V0LnBheXBhbC5jb20iLCJkaXJlY3RCYXNlVXJsIjpudWxsLCJhbGxvd0h0dHAiOnRydWUsImVudmlyb25tZW50Tm9OZXR3b3JrIjp0cnVlLCJlbnZpcm9ubWVudCI6Im9mZmxpbmUiLCJ1bnZldHRlZE1lcmNoYW50IjpmYWxzZSwiYnJhaW50cmVlQ2xpZW50SWQiOiJtYXN0ZXJjbGllbnQzIiwiYmlsbGluZ0FncmVlbWVudHNFbmFibGVkIjp0cnVlLCJtZXJjaGFudEFjY291bnRJZCI6ImFjbWV3aWRnZXRzbHRkc2FuZGJveCIsImN1cnJlbmN5SXNvQ29kZSI6IlVTRCJ9LCJjb2luYmFzZUVuYWJsZWQiOmZhbHNlLCJtZXJjaGFudElkIjoiMzQ4cGs5Y2dmM2JneXcyYiIsInZlbm1vIjoib2ZmIn0=";



var clientToken = "<%= @token %>";

braintree.setup(clientToken, "dropin", {
  container: "payment-form"
});
</script>
&#13;
&#13;
&#13;

post 'checkout', to: 'reservations#checkout'
get 'checkout', to: 'reservations#checkout'

1 个答案:

答案 0 :(得分:0)

我建议您将结帐方法作为成员方法,即在网址中传递预订的ID。

post 'checkout/:id', to: 'reservations#checkout', :as => 'reservation_checkout'

通过这样做,您将能够找到类似的预订。

@reservation = Reservation.find(params[:id]) #so you will not get the error undefined method `total' for nil:NilClass

我想知道为什么不使用html.erb

<%= form_tag reservation_checkout_path(@reservation) %>
  #your fields
<% end %>