Rails 4.将表单信息从一个控制器(没有模型)移动到另一个控制器(没有模型),以便将参数传递给方法

时间:2015-03-15 19:43:12

标签: ruby ruby-on-rails-4 redis

我有一个简单的应用程序,用户可以在其中购买物品。在项目页面上将有一个添加到购物车按钮。推车控制器使用REDIS关系显示项目,它没有模型。一旦用户查看了商品并希望购买,他们将被引导到购买视图,一旦他们用条带支付,就会在购买控制器中创建订单。购买控制器也没有模型。

user.rb模型:

class User < ActiveRecord::Base
    has_many :orders

    def get_cart_items
        cart_ids = REDIS.smembers "cart#{id}"
        Item.find(cart_ids)
    end

    def purchase_cart_items!(recipient_name:, recipient_address:)
        get_cart_items.each { |item| purchase!(item, recipient_name, recipient_address) }
        REDIS.del "cart#{id}"
    end

    def purchase!(item, recipient_name, recipient_address)
        self.orders.create!(user_email: self.email,
                            item_id: item.id,
                            recipient_name: recipient_name)
                            recipient_address: recipient_address)                     
   end
end

购买控制器:

class PurchasesController < ApplicationController

    def create
        Stripe::Charge.create(
        ...
        )
        ##########
        current_user.purchase_cart_items!(recipient_name:, recipient_address:)
        ##########
    end
end

推车控制器:

class CartsController < ApplicationController
    def create
        REDIS.sadd current_user_cart, params[:item_id]
    end
    def destroy
        REDIS.srem current_user_cart, params[:item_id]
    end
 end

通过调用user_email:item_id:可以轻松创建self.emailitem.id的订单属性,因为它们已附加到模型中,但我不确定如何使用 购物车视图 中的表单,让用户在中为recipient_name:方法输入recipient_address:purchase_cart_items!(recipient_name:, recipient_address:)个参数购买控制器

我需要:

  1. 在购物车视图中创建一个表单,用户可以在另一个控制器中为方法输入参数
  2. 提交表单详细信息后,我需要将用户重定向到购买视图
  3. 然后必须将表单信息作为参数传递给purchase-controller
  4. 中的方法

    谢谢!

1 个答案:

答案 0 :(得分:0)

需要使用带有GET方法的form_tag才能将表单信息提交给正确的控制器。 在购物车视图中:

<%= form_tag({controller: "purchases", action: "new"}, method: "get") do %>
  <%= label_tag 'recipient name: ' %>
  <%= text_field_tag 'recipient_name' %>
  <%= label_tag 'recipient address: ' %>
  <%= text_field_tag 'recipient_address' %>
  <%= submit_tag "PAY" %>
<% end %>

在购买控制器的new操作中,我使用params获取表单信息,session使表单信息可用于同一控制器中的创建操作:

class PurchasesController < ApplicationController
    def new
        @name = params[:name]
        @address = params[:address]
        session[:name] = @name
        session[:address] = @address
    end
    def create
        Stripe::Charge.create(
        ...
        )
    ##########
        @name = session[:name]
        @address = session[:address]
        current_user.purchase_cart_destinations!(name: @name, address: @address)
    ##########
    end
end

在purchase-controller的create操作中可以访问表单信息后,current_user.purchase_cart_items!的关键字参数很容易使用@name@address的实例变量进行设置