我使用位于orders / new的braintree api结帐。但是,我想要向用户收取的价格是根据帖子ID确定的。用户链接到posts / show中的orders / new,如果这有帮助的话。 提前谢谢!
在create方法中访问:post_id有点棘手,因为没有链接到创建视图以发送:post_id with。
orders_controller创建方法
def create
post=Post.find(params[:post_id])
nonce = params[:payment_method_nonce]
render action: :new and return unless nonce
result = Braintree::Transaction.sale(
amount: post.price,
payment_method_nonce: nonce
)
end
end
命令将用户发送到create方法的新视图
<h2>Purchase Ticket (refresh if fields don't load)</h2>
<p>the price is <%= number_to_currency(@post.price) %></p>
<script src="https://js.braintreegateway.com/v2/braintree.js"></script>
<%= render 'payment/form' %>
使用此表单的更新顶部
时<%= form_tag orders_path, method: 'post' do %>
<%= hidden_field :post_id, @post.id %>
<div id="dropin"></div>
<input type="submit" value="Pay">
<% end %>
<%= @params %>
答案 0 :(得分:1)
您可以将post_id
添加到指向post#show
操作的orders#new
视图的链接中:
<%= link_to 'Purchase', new_order_path(post_id: @post.id) %>
在您的订单管理员中,您还需要允许post_id
被强大的参数部分接受:
def post_params
params.permit(:post_id)
end
我不知道您orders_params
方法中已包含的内容,因此我已根据guides向您提供了最低限度的内容。
然后在OrdersController
操作中,您可以从参数中获取post_id
:
def new
post_id = post_params[:post_id]
# ...
end
更新:将答案扩展为包含其他创建操作条件。
也许最直接的选择是在表单中添加隐藏字段来存储post_id
:
# app/views/payments/_form.html.erb
<%= form_tag orders_path, method: 'post' do %>
<%= hidden_field_tag :post_id, @post.id %>
<div id="dropin"></div>
<input type="submit" value="Pay">
<% end %>
这意味着您在帖子中放入post_id
方法参数的link_to
将存储在表单中并提交给create操作,您可以以相同的方式访问它:
class OrdersController < ApplicationController
def new
@post = Post.find(post_params[:post_id])
end
def create
post = Post.find(post_params[:post_id])
render text: post.price # to demonstrate
end
private
def post_params
params.permit(:post_id)
end
end
我已快速组合demo application来显示正常工作的代码。