将对象从一个控制器操作传递到另一个控制器操作

时间:2015-10-26 15:21:57

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

我有一个request对象,我想传递给我的charges_controller。我可以将其传递给new动作,但在调用新动作之后,我需要在同一request中传递给创建对象的相同charges_controller对象。我不明白。以下是将request_controller传递给费用控制器的初始request_id操作。

class Users::RequestsController < ApplicationController
before_filter :authenticate_user!

def create
  @user = current_user
    if @request = @user.request.create!(authorization_params)
      if @request.user_paying == true
        redirect_to new_users_charge_path(id: @request)
      else
        redirect_to users_dashboard_path
      end
    else
      redirect_to users_dashboard_path, :error => "There is something wrong and your request has not been submitted."
    end
end````

然后将其传递给充电控制器中的新方法。这是我的收费控制器。

class Managers::ChargesController < ApplicationController
  before_filter :authenticate_user!

  def new
    @request = Request.find(params[:id])
    @user = current_user
    @amount = @request.user_amount
  end

  def create
    # Amount in cents
    @request = Request.find params[:request_id]
    @user = current_user
    @amount = @request.user_amount

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

charge = Stripe::Charge.create(
  :customer    => customer.id,
  :amount      => @amount,
  :description => 'Manager Paid Report',
  :currency    => 'usd'
)
@request.report_paid = true
@request.save!
redirect_to managers_dashboard_path, :notice => "You have succesfully requested a pre-paid report from #{@reportapproval.tenant_last_name}."

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

我可以将请求信息输入charges/new.html视图。但是当我创建费用时,找不到请求。如何将请求传递给创建操作?

这是新视图......

<h4>Total Payment Due: <%= number_to_currency(@amount.to_i/100.0) %>
  <%= form_tag users_charges_path do %>
    <%= hidden_field_tag :request_id, @request.id %>
<br />
    <script src="https://checkout.stripe.com/checkout.js"   class="stripe-button"
        data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
        data-description="Payment"
        data-amount="<%= @amount %>"
        data-locale="auto" >
        </script>
  <% end %>

2 个答案:

答案 0 :(得分:2)

控制器只是响应HTTP请求 - 无法在Rails内部转发请求。这是一个非常有意识的设计决定。

如果您需要在请求之间存储数据,您可以将其保存在数据库,会话或某种缓存机制(如Memcached / Redis)中。

最常用于Rails中的数据存储在数据库中,并在请求参数中传递ID或其他唯一标识符。

如果您需要将ID传递给"Request"对象,您可以将其传递到请求网址或请求主体中PUT/PATCH/POST

因此,在您的情况下,您需要确保#new操作发布到:

post "/managers/charges/:request_id"

或表格包含

<%= hidden_field_tag 'request_id', @request.id %>

<强> PS

Request虽然技术上不是保留字但对于模型来说是一个非常糟糕的名称,因为它最终会导致与ActionDispatch::Request的冲突和混淆,特别是如果您使用控制器实例变量@request

正如你从上面我的回答中看到的那样,由于 request 这个词已经在web开发中具有非常具体的内涵,所以它会变得令人困惑。

同样适用于Response

使用PaymentRequestany other synonym

答案 1 :(得分:1)

假设您在charges/new视图中有表单,可以使用隐藏的表单字段设置request_id

<%= hidden_field_tag :request_id, @request.id %>

您应该在<%= form_for ... do |f| %><% end %>之间添加上述行。

在该示例中,您假设create操作会以某种方式自动传入request_id。 Rails不会这样做,在每个请求中都需要显式提供控制器处理该请求的所有信息。

我希望有所帮助! ;)