将对象从一个控制器操作传递到另一个控制器操作
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
。
使用PaymentRequest
或any other synonym。
我有一个 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
。
使用PaymentRequest
或any other synonym。