从rails中的表单提交Select_tag值

时间:2017-01-08 20:34:27

标签: ruby-on-rails forms

我在使用select_tag的表单视图中对params感到困惑。 表单内容类似于:

<%= form_for(@order) do |f| %>
  <div class="field">
    <%= f.label :begin %><br>
    <%= f.datetime_select :begin %>
  </div>
  <div class="field">
    <%= f.label :end %><br>
    <!-- %= f.datetime_select :end % -->
  </div>

  <div class="field">
    <%= f.label :plan%><br>
    <%= select_tag("plan", options_for_select([['3个月', 1], ['6个月', 2],  ['12个月', 3]], 3)) %>
  </div>
  <div class="field">
    <%= f.label :activiated %><br>
    <div id=activiationid>This will be changed after you have made payment </div>
  </div>

  <div class="field">
    <%= f.label :bill %><br>
    <%= f.text_field :bill %>
  </div>
  <div class="actions">
    <%= f.submit %>
    <%= button_tag t('Cancel'), type: "submit", name: "cancel", value: true %> 
  </div> 
  <div class="actions">
  </div>
<% end %>

相应的行动方法

class OrdersController < ApplicationController
 def update
    respond_to do |format|
      byebug
      if @order.update(order_params)
        format.html { redirect_to @order, notice: 'Order was successfully updated.' }
        format.json { render :show, status: :ok, location: @order }
      else
        format.html { render :edit }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end
    def order_params
      byebug
      params.require(:order).permit(:begin, :end, :plan, :activiated, :bill)
    end
end

提交表单后,params中的order_params

{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"b6D7xOlS0vf+e0WkdrBA07fQxOrahsrmEMtIws2N2hfBsyHTq+qPvQJ0CeSKNW3DQk3KALWknlcFApYdtPJ9BA==", "order"=>{"begin(1i)"=>"2017", "begin(2i)"=>"1", "begin(3i)"=>"5", "begin(4i)"=>"18", "begin(5i)"=>"58", "bill"=>"3420"}, "plan"=>"1", "commit"=>"Update Order", "controller"=>"orders", "action"=>"update", "id"=>"2841"}

问题是:

  1. 为什么计划字段(select_box)不在params order 部分中。
  2. 如何构建初始化的@order,计划。 3。如何更好地编写<%= select_tag("plan", options_for_select([['3个月', 1], ['6个月',以便计划将在params内。

1 个答案:

答案 0 :(得分:1)

我认为你遇到了保留字问题。

在order_params定义中有2个属性:begin和:end,必须更改(名称)。

begin

end

是红宝石中的保留字 - 你可以在这里看到一个列表:

http://www.java2s.com/Code/Ruby/Language-Basics/Rubysreservedwords.htm

请记住,rails有自己的一组保留字,你可以谷歌。发生的事情是rails看到end并误解了情况并结束了params哈希。尝试将其名称更改为start_time和end_time或类似名称。

更新

要使用select_tag,您必须确保设置name参数。否则它将不会包含在作为表单数据其余部分的数组/对象中。如果您使用浏览器的“检查”功能,则可以看到此示例。看看任何字段名称,你会看到它看起来像:

name="order[attributename]"

您可以在options_for_select之后手动设置此名称,或者您可以使用form_for标准选择,其中输入附加到表单对象:

<%= f.select(:plan, [['3个月', 1], ['6个月', 2], ['12个月', 3]], {selected: 3} )%>