【问题标题】:Pass an object from one controller action to another将对象从一个控制器动作传递到另一个
【发布时间】:2015-10-27 02:00:07
【问题描述】:

我有一个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 %>

【问题讨论】:

  • 控制器之间不应直接通信。它们应该干燥且短。您是否考虑过将此业务逻辑移植到服务或控制器下方的公共层上?
  • 我认为您不需要传递请求:我认为您只需要传递一些少量数据,例如请求对象的 id。这可以最干净地在参数中传递。
  • @matheus208 我很新,我听说过服务,我会阅读它们。我认为它们与实际模型不同。
  • @max 实际上我只需要收费就可以从请求中获取信息并发布到请求中。在我的控制器中,它试图通过 id 查找请求,但我不确定如何让新通行证创建 ID

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


【解决方案1】:

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

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

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

如果您需要将 id 传递给 "Request" 对象,您可以在 request url 中传递它,或者在 @987654324 的情况下在 request 正文中传递它@。

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

post "/managers/charges/:request_id"

或者表格包含

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

附言

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

正如您从我上面的回答中看到的那样,它变得令人困惑,因为 request 这个词已经在 Web 开发中具有非常具体的含义。

这同样适用于Response

使用PaymentRequestany other synonym

【讨论】:

  • Request 不是实际名称,我只是更改了它以使其更易于理解。但是隐藏标签不会将其发送到模型而不是控制器操作吗?没有收费模式
  • 没有。 Rails 不会自动为模型分配参数。
  • 那么当我在控制器中调用它时,语法会是什么样子。因为它不使用参数
  • 哥们,你在说什么?当然它使用参数。 “语法”是params[:request_id]guides.rubyonrails.org/…
  • Rails 不会自动获取该参数并将其传递给控制器​​中的模型。
【解决方案2】:

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

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

您应该在&lt;%= form_for ... do |f| %&gt;&lt;% end %&gt; 之间添加上面的行。

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

希望对您有所帮助! ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多