0

我正在使用Stripe簽出工具來開發我的工具租賃應用程序項目的結帳過程。當我想要動態地改變租用價格時,我遇到了一個問題,這取決於發佈工具的人想要租用的租用價格。如何從單獨的控制器訪問實例變量(結算量變量)

我嵌套我的工具中我的費用,像這樣:

Rails.application.routes.draw do 
    devise_for :users 

    root 'pages#home' 

    resources :tools do 
    resources :charges 
    get :manage, :on => :collection 
    end 

當我瀏覽到/工具/ 1 /費用/新我收到以下錯誤:

Couldn't find Tool with 'id'= 

這是我的費用控制:

class ChargesController < ApplicationController 

    def new 
     @tool = Tool.find(params[:id]) 
     @amount = @tool.rent_price * 100 
    end 

    def create 
     @tool = Tool.find(params[:id]) 
     @amount = @tool.rent_price * 100 

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

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

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

    private 

    def tool_params 
     params.require(:tool).permit(:name, :description, :user_id, :tool_image, :rent_price) 
    end 

end 

這是我的工具控制器:

class ToolsController < ApplicationController 
before_action :set_tool, only:[:show, :edit, :update, :destroy] 
before_action :authenticate_user!, only:[:new, :destroy, :edit, :manage], notice: 'you must be logged in to proceed' 

    def index 
     @tools = Tool.all 
    end 

    def manage 
     @user = current_user 
     @tools = @user.tools 
    end 

    def show 
    end 

    def new 
     @tool = Tool.new 
    end 

    def create 
     @tool = Tool.new(tool_params) 
     if @tool.save 
      redirect_to @tool 
     else 
      redirect_to :action => "new" 
      flash[:notice] = "You did not fill out all the fields" 
     end 
    end 

    def edit 
    end 

    def update 
     @tool.update(tool_params) 
     redirect_to @tool 
    end 

    def destroy 
     @tool.destroy 
     redirect_to tools_path 
    end 

    private 

    def set_tool 
     @tool = Tool.find(params[:id]) 
    end 

    def tool_params 
     params.require(:tool).permit(:name, :description, :user_id, :tool_image, :rent_price) 
    end 

end 

看看我的收費控制器。 Stripe結帳文檔通常具有硬編碼到@amount實例變量中的金額值。不過,我希望它由工具創建者設置。我在我的工具表上有一個rent_price列,並且想要將此值傳遞給金額實例變量。

我試圖通過找到正在創建費用的工具來做到這一點。但是沒有收費模式,因此工具和收費之間沒有關聯。條紋結賬無需使用模型。在這種情況下,我不確定如何訪問收費控制器中由工具創建者(Tool.rent_price)設置的金額。看起來沒有Tool.id被傳遞給參數。有想法該怎麼解決這個嗎?

我想我會創建一個收費模型,即使條紋不說,並使用一個關聯鏈調用的金額。但不知道是否有更好的方式,而不必創建收費模型。

+0

您可以使用'rake routes'來檢查存在哪些路由以及它們採用哪些參數。 – spickermann

回答

2

對我來說,它看起來像使用錯誤的參數或路線問題的問題。

您是否嘗試過使用Tool.find(params[:tool_id])而不是Tool.find(params[:id])

根據有關嵌套資源http://guides.rubyonrails.org/routing.html#nested-resources,在您的示例文件,params[:id]應與收費資源和params[:tool_id]到工具的資源。

+0

這是正確的!我仍然習慣了很多這些東西,謝謝! – coderwannabe2