或者,这似乎正在发生。我在生产环境中遇到错误,无法在开发中重新创建。基本上,我试图将布克与预订联系起来。如果布克不存在,我想邀请他/她。
# 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
方法中删除用户参数,但实际上我得到了一个“未允许的参数”错误。为“用户”定义允许属性的正确方法是什么?完全失去了这个。
答案 0 :(得分:0)
我怀疑您的强参数不正确/缺少嵌套user
。如果你发布它们我可以修复它的那一面,但一个简单的临时修复就是简单地使用
params[:user][:email]
即直接访问参数。回到这个问题,看一下在强参数中使用嵌套参数:
答案 1 :(得分:0)
从未发现问题究竟是什么。虽然没有使用Pundit来强力修复它。