在订单/新视图和订单/创建中访问show中的帖子ID

时间:2015-01-13 04:10:23

标签: ruby-on-rails ruby-on-rails-4

我使用位于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 %>

1 个答案:

答案 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来显示正常工作的代码。