在生产中丢失参数?

时间:2014-09-25 14:05:55

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

或者,这似乎正在发生。我在生产环境中遇到错误,无法在开发中重新创建。基本上,我试图将布克与预订联系起来。如果布克不存在,我想邀请他/她。

# GET /bookings/new
def new
  @booking = Booking.new
  authorize @booking

  @booking.venue = Venue.new
  @booker = User.new

end

相关创建代码;

def create

  @booking = Booking.new(booking_params)
  authorize @booking

  booker_found = set_booker

和set_booker私有方法

def set_booker

  logger.info "booker: #{booking_params.inspect}"

  # set existing user as booker or prepare inviting a new user
  booker_found = false
  @booker = User.find_by_email(booking_params[:user][:email])

等。 最后一行是我在生产中遇到错误的地方,因为booking_params[:user]不存在。我尝试在开发ENV中重置我的数据库,代码工作正常。然而在制作中我总是得到NoMethodError (undefined method '[]' for nil:NilClass)

这是我的相关表格代码;

<%= simple_form_for(@booking, :wrapper => :bootstrap3 ) do |f| %>
  <%= f.simple_fields_for @booker do |user_form| %>
    <%= user_form.input :email, label: "Booker e-mail" %>
  <% end %>

这是记录器在开发中显示的内容;

Parameters: {"utf8"=>"✓", "authenticity_token"=>"lala", "booking"=>{"name"=>"Mah Booking", "date"=>"02-10-2014", "venue_name"=>"Meeeeeeeeeeee", "venue_id"=>"", "user"=>{"email"=>"booker@boekkoek.nl"}, "artist_fee"=>"0.00"}, "commit"=>"Create Booking", "locale"=>"en"}

booker: {"date"=>"02-10-2014", "name"=>"Mah Booking", "artist_fee"=>"0.00", "venue_id"=>"", "venue_name"=>"Meeeeeeeeeeee", "user"=>{"email"=>"booker@boekkoek.nl"}}

这是来自我的production.log

Parameters: {"utf8"=>"✓", "authenticity_token"=>"yada", "booking"=>{"name"=>"tttt", "date"=>"02-10-2014", "venue_name"=>"meee", "venue_id"=>"", "user"=>{"email"=>"info@blabl.nl"}, "artist_fee"=>"0.00"}, "commit"=>"Create Booking", "locale"=>"en"}

booker: {"name"=>"tttt", "date"=>"02-10-2014", "artist_fee"=>"0.00", "venue_id"=>""}

我不知道为什么订单不同,而且,它似乎只是在scene_id之后“切断”,这显然会导致错误。以前有人见过这样的行为吗?

修改 这是我的booking_params私人方法

def booking_params
  params.require(:booking).permit(*policy(@booking || Booking).permitted_attributes)
end

和专家政策;

def permitted_attributes
    [:status,
   :date,
   :name,
   :get_in_time_string,
   :soundcheck_time_string,
   :dinner_time_string,
   :show_time_string,
   :show_time_end_string,
   :artist_fee,
   :venue_id,
   :venue_name,
   :act_ids => [],
   user: [ :id, :email ]
    ]
end

就像我说的,同样的代码在开发中运行良好。我可以重现问题的唯一方法是从我的permitted_attributes方法中删除用户参数,但实际上我得到了一个“未允许的参数”错误。为“用户”定义允许属性的正确方法是什么?完全失去了这个。

2 个答案:

答案 0 :(得分:0)

我怀疑您的强参数不正确/缺少嵌套user。如果你发布它们我可以修复它的那一面,但一个简单的临时修复就是简单地使用

params[:user][:email]

即直接访问参数。回到这个问题,看一下在强参数中使用嵌套参数:

Rails 4 - Strong Parameters - Nested Objects

答案 1 :(得分:0)

从未发现问题究竟是什么。虽然没有使用Pundit来强力修复它。