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

Pass an object from one controller action to another

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

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 %>

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

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

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

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

希望对您有所帮助! ;)

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

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

最常见的是 Rails 您将数据存储在数据库中并在请求参数中传递 ID 或其他唯一标识符。

如果您需要将 id 传递给 "Request" 对象,您可以在 request url 或 中传递它]request body 在 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