Ruby on rails 如何将参数值添加到单选按钮标记

Ruby on rails 如何将参数值添加到单选按钮标记,ruby-on-rails,Ruby On Rails,我有一张订阅表。我把所有的信息移到了一页。之前,我将用户链接到计划的两个单独页面/subscriptions/new?plan_id=1或/subscriptions/new?plan_id=12 现在该页面仅为订阅/new。如何将参数添加到每个单选值中,以便当用户使用其信用卡或paypal签出时,它将为他们注册使用单选按钮选择的订阅计划 <%= form_for @subscription do |f| %> <div class="col-3"> &l

我有一张订阅表。我把所有的信息移到了一页。之前,我将用户链接到计划的两个单独页面
/subscriptions/new?plan_id=1
/subscriptions/new?plan_id=12

现在该页面仅为
订阅/new
。如何将参数添加到每个单选值中,以便当用户使用其信用卡或paypal签出时,它将为他们注册使用单选按钮选择的订阅计划

  <%= form_for @subscription do |f| %>
  <div class="col-3">
    <div class="plan">
      <%= image_tag "/assets/best1.png" %>

      <h1><%= radio_button_tag :plan_id, '1,', true %><label for="plan_id_1"><span><span></span></span></label>$13.50 a year</h1>
      <h2>12-Month Membership</h2>
    </div>
    <div class="plan">
      <h1><%= radio_button_tag :plan_id, '2' %><label for="plan_id_2"><span><span></span></span></label>$1.35 a month</h1>
      <h2>1-Month Membership</h2>
    </div>
  </div>
  <div class="sm_form_container">
    <div class="row">
      <div class="field">
        <h1>Payment Information</h1>
     </div>
    </div> 
    <div class="row">
      <div class="field">

      <% if @subscription.errors.any? %>

          <h2><%= pluralize(@subscription.errors.count, "error") %> prohibited this subscription from being saved:</h2>
          <ul>
          <% @subscription.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
          <% end %>
          </ul>

      <% end %>

      <%= f.hidden_field :plan_id %>
      <%= f.hidden_field :stripe_card_token %>
      <%= f.hidden_field :paypal_customer_token %>
      <%= f.hidden_field :paypal_payment_token %>

      <% unless @subscription.payment_provided? %>

        <%= radio_button_tag :pay_with, :card, true %>
        <%= label_tag :pay_with_card do %>
          <%= image_tag "visa.png" %>
          <%= image_tag "mastercard.png" %>
          <%= image_tag "discover.png" %>
          <%= image_tag "american_express.png" %>
          <%= image_tag "jcb.png" %>
        <% end %>
        <%= radio_button_tag :pay_with, :paypal %>
        <%= label_tag :pay_with_paypal do %>
          <%= image_tag "paypal.png" %>
        <% end %>
      <% end %>
      </div>
    </div>
    <div class="row">
      <div id="paypal_checkout" style="display:none">
        <%= link_to image_tag("https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"), paypal_checkout_path(plan_id: @subscription.plan_id) %>
      </div>
    </div>
    <div id="billing_fields">
      <div class="field">
          <%= f.hidden_field :user_id, :value => current_user.id %> 
          <%= f.hidden_field :email, :value => current_user.email  %>
        </div>
        <% if @subscription.payment_provided? %>
          Payment has been provided. Click "Subscribe" to complete the subscription.
        <% else %>
      <div class="row">
          <div class="field">
            <%= label_tag :card_owner, "Name (as it appears on the card)" %>
            <%= text_field_tag :card_owner, nil, name: nil %>
          </div>
          <div class="field">
            <%= label_tag :card_number, "Credit Card Number" %>
            <%= text_field_tag :card_number, nil, name: nil %>
          </div>
      </div>
      <div class="row">
          <div class="field">
            <%= label_tag :card_code, "Security Code on Card (CVV)" %>
            <%= text_field_tag :card_code, nil, name: nil %>
          </div>
          <div class="field" id="expiration">
            <%= label_tag :card_month, "Card Expiration" %><br />
            <%= select_month nil, {add_month_numbers: true}, {name: nil, id: "card_month"} %>
            <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"} %>
          </div>
        <% end %>
        <div id="stripe_error">
          <noscript>JavaScript is not enabled and is required for this form. First enable it in your web browser settings.</noscript>
        </div>
      </div>
      <div class="row">
        <div class="field"><%= f.submit "Subscribe", class: 'btn', style: "width: 40%; margin-left: 165px"  %></div>
      </div>
      </div>
    <% end %>
  </div>
</div>
路线:

  resources :subscriptions
  resources :plans
  get 'paypal/checkout', to: 'subscriptions#paypal_checkout'

假设您有一个成员模型,并且成员有一个id和一个名称(除其他外)。订阅具有计划id(成员计划)

订阅控制器从数据库加载成员身份

def edit
  @memberships = Memberships.all
end
在编辑视图中,使用成员身份填充单选按钮集,将计划id设置为成员身份id(我使用haml,这是从表布局中获得的,但它应该很容易转换)


保存时,从params生成的订阅模型将具有所选成员模型的plan_id值。

您可以在
新建
操作中预填充模型,然后使用表单生成器,以便这些预填充值传播到视图中

控制器:

def new
  if params.has_key?(:plan_id) 
    plan = Plan.find(params[:plan_id])
  else
    # make plan with id 1 our default plan if no plan_id has been given
    plan = Plan.find(1)
  end

  # this should set the plan_id in the Subscription model,
  # if not - ensure you have a `belongs_to :plan` inside your Subscription model.
  @subscription = plan.subscriptions.build
  if params[:PayerID]
    @subscription.paypal_customer_token = params[:PayerID]
    @subscription.paypal_payment_token = params[:token]
    @subscription.email = @subscription.paypal.checkout_details.email
  end
  render layout: 'new_application'   
end
查看:

def new
  if params.has_key?(:plan_id) 
    plan = Plan.find(params[:plan_id])
  else
    # make plan with id 1 our default plan if no plan_id has been given
    plan = Plan.find(1)
  end

  # this should set the plan_id in the Subscription model,
  # if not - ensure you have a `belongs_to :plan` inside your Subscription model.
  @subscription = plan.subscriptions.build
  if params[:PayerID]
    @subscription.paypal_customer_token = params[:PayerID]
    @subscription.paypal_payment_token = params[:token]
    @subscription.email = @subscription.paypal.checkout_details.email
  end
  render layout: 'new_application'   
end
首先删除隐藏的字段标记
,然后调整此部分以使用表单生成器,即
。然后表单生成器将负责选择正确的单选按钮

  <%= form_for @subscription do |f| %>
  <div class="col-3">
    <div class="plan">
      <%= image_tag "/assets/best1.png" %>

      <h1><%= f.radio_button :plan_id, 1 %><label for="plan_id_1"><span><span></span></span></label>$13.50 a year</h1>
      <h2>12-Month Membership</h2>
    </div>
    <div class="plan">
      <h1><%= f.radio_button :plan_id, 2 %><label for="plan_id_2"><span><span></span></span></label>$1.35 a month</h1>
      <h2>1-Month Membership</h2>
    </div>
  </div>

  ....

每年13.50美元
12个月会员资格
每月1.35美元
一个月会员资格
....

您使用
*\u标签的原因是什么?如果
@subscription
是一个模型实例,您可以分别执行
,并使用
参数[:subscription][:plan\u id]
@sled I刚包含控制器来获取所选值。我忘了我让它读了
plan=plan.find(1)
,这就是为什么它总是带你去计划1。我正在考虑将控制器更改为
plan=plan.find(params[:plan\u id])
,如果我传入视图,它应该可以工作。但是,您可以展示在视图中传递参数的示例吗?我只是快速查看了一下您的代码。我看不出你有什么不同。我的意思是说,在我发表最后一篇文章之前,我做了一些调整,但没有成功。我遇到
无法找到没有ID的Plan
,这就是为什么我会问如何在视图中传递参数。我将c&p你的代码,但它实际上是我在过去尝试过的同一件事。为了确认它,复制相同的错误(因为我们有相同的代码)
ActiveRecord::RecordNotFound at/subscriptions/new无法在第行
Plan=Plan.find(params[:Plan\u ID])
上找到没有ID的计划,这意味着您没有在url中传递计划ID参数,您的路线看起来如何?我添加了一个检查,在没有通过计划ID的情况下,检查ID为1的产品。啊,我忘了订阅控制器中的其他代码。调用的
paypal\u checkout
操作。代码addedmhh。。。当您被重定向到
new
控制器时,浏览器中的url中是否有参数,例如“/subscriptions/new?plan_id=2”或类似的参数?
  <%= form_for @subscription do |f| %>
  <div class="col-3">
    <div class="plan">
      <%= image_tag "/assets/best1.png" %>

      <h1><%= f.radio_button :plan_id, 1 %><label for="plan_id_1"><span><span></span></span></label>$13.50 a year</h1>
      <h2>12-Month Membership</h2>
    </div>
    <div class="plan">
      <h1><%= f.radio_button :plan_id, 2 %><label for="plan_id_2"><span><span></span></span></label>$1.35 a month</h1>
      <h2>1-Month Membership</h2>
    </div>
  </div>

  ....