我有一个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 %>
答案 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
。
使用PaymentRequest
或any other synonym。
答案 1 :(得分:1)
假设您在charges/new
视图中有表单,可以使用隐藏的表单字段设置request_id
:
<%= hidden_field_tag :request_id, @request.id %>
您应该在<%= form_for ... do |f| %>
和<% end %>
之间添加上述行。
在该示例中,您假设create
操作会以某种方式自动传入request_id
。 Rails不会这样做,在每个请求中都需要显式提供控制器处理该请求的所有信息。
我希望有所帮助! ;)