如何从单独的控制器访问实例变量(结帐时的金额变量)

时间:2015-04-19 10:18:21

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller stripe-payments

我正在使用Stripe checkout处理工具租借应用项目的结帐流程。当我想动态改变租金价格时,我遇到了一个问题,这取决于发布该工具的人想要租用它的内容。

我的费用嵌套在我的工具中,如下:

Rails.application.routes.draw do
  devise_for :users

  root 'pages#home'

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

当我导航到/ tools / 1 / charges / new时,我收到以下错误:

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 => 'example@stripe.com',
        :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

看看我的收费控制器。条带检出文档通常具有硬编码到@amount实例变量中的金额值。但是我希望它由工具创建者设置。我的工具表上有一个rent_price列,想要将此值传递给amount实例变量。

我尝试通过找到创建费用的工具来实现。但是没有充电模型,因此工具和充电之间没有关联。条纹结帐在没有模型的情况下工作。在这种情况下,我不确定如何访问费用控制器中工具创建者(Tool.rent_price)设置的金额。似乎没有Tool.id传递给param。关于如何解决这个问题的任何想法?

我想我会创建一个收费模型,即使条纹没有说并且使用关联链接调用金额。但不确定是否有更好的方法,而无需创建收费模型。

1 个答案:

答案 0 :(得分:2)

对我来说,使用错误的参数或路线问题似乎有问题。

您是否尝试使用Tool.find(params[:tool_id])代替Tool.find(params[:id])

根据有关嵌套资源http://guides.rubyonrails.org/routing.html#nested-resources的文档,在您的示例中,params[:id]应与费用资源相关,params[:tool_id]与工具资源相关。