【问题标题】:Rails 4.0 and Dynamic FieldsRails 4.0 和动态字段
【发布时间】:2013-08-29 12:25:42
【问题描述】:

所以我正在重写/升级一个 3.0 应用程序,它使用基于这个 pro Railscast http://railscasts.com/episodes/403-dynamic-forms 的动态字段。

它加载动态字段的方式是通过以下代码:

  <%= f.hidden_field :tour_type_id %>

  <%= f.fields_for :options, OpenStruct.new(@trip.options) do |builder| %>
     <% @trip.tour_type.type_fields.where(:variable => false).each do |field| %>
           <%= render "type_fields", field: field, f: builder %>
      <% end %>
    <% end %>

这是正确呈现 html。

当我通过控制台执行创建时,我为 :options 传递的哈希值正确保存。但是,当我通过表单提交值时,它会将哈希值保存为 nil。

我认为这可能是因为我在控制器中拥有强大的参数。

  def trip_params
     params.require(:trip).permit(:options => {:id => :value})
  end

我也试过

  def trip_params
     params.require(:trip).permit(:options => {})
  end

rails 服务器日志中的参数看起来不错,但不知何故,在更新发生之前,选项的值被设置为 nil

  Processing by TripsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "trip"=>{"options"=>{"1"=>"400"}}, "commit"=>"Update Trip", "id"=>"1"}

 SQL (1.0ms)  UPDATE "trips" SET "updated_at" = $1, "options" = $2 WHERE "trips"."id" = 1  [["updated_at", Mon, 26 Aug 2013 05:13:35 UTC +00:00], ["options", "--- !ruby/hash:ActionController::Parameters\n'1': \n"]]

我还在模型中添加了序列化操作

 class Trip < ActiveRecord::Base
   serialize :options, Hash
 end

我真的不知道为什么这段代码在 Rails v 4、Ruby V 1.9.3 中不起作用。

这段代码是根据动态表单 RailsCast 建模的。

编辑:

我尝试了此处列出的解决方案http://guides.rubyonrails.org/action_controller_overview.html#outside-the-scope-of-strong-parameters

def trip_params
  params.require(:trip).permit(
    :admin_name, 
    :brochure_title, 
    :description, 
    :organized_by, 
    :start_date, 
    :end_date, 
    :tour_type_id, 
    :pay_by, 
    :extension
  ).tap do |whitelisted|
    whitelisted[:options] = params[:trip][:options]
  end
end

我现在得到一个发现的未经许可的参数:选项错误。

【问题讨论】:

  • params.require(:trip).permit!(:options)你能试试这个吗
  • @RajarshiDas permit! 不接受参数 api.rubyonrails.org/classes/ActionController/…
  • 哦,对不起,那里不应该是感叹号params.require(:trip).permit(:options)谢谢@j03w

标签: ruby-on-rails


【解决方案1】:

strong_parameters 似乎不支持允许使用任意键进行散列,我认为这是有充分理由的……

rails github repo 上有一个解决方案建议:https://github.com/rails/rails/issues/9454#issuecomment-14167664RailsGuides http://guides.rubyonrails.org/action_controller_overview.html#outside-the-scope-of-strong-parameters

你的情况是这样的

params.require(:trip).permit(:foo, :bar, :baz).tap do |whitelisted|
  whitelisted[:options] = params[:trip][:options]
end

如果optionsTrip 的唯一属性,那么它和

params.require(:trip).permit!

【讨论】:

  • options 不是唯一的属性。那么在上面的例子中 :foo, :bar, :baz 是其他字段名,然后该块将带有任意键的哈希列入白名单?
  • @Hillary 是的,完全正确
  • @Hillary 嗯,奇怪……具体的错误是什么?介意更新您原来的问题吗?
  • 试试 whitelisted[:options] = params.require(:trip).slice(:options).permit! 虽然这是未经测试的
  • 仍然得到选项的 unpermitted params 错误。问题可能是因为动态字段的html。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多