我在使用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"}
问题是:
params
的 order 部分中。 <%= select_tag("plan", options_for_select([['3个月', 1], ['6个月',
以便计划将在params
内。 答案 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} )%>