我在处理不尊重验证的对象时遇到了麻烦。 我正在构建一个应用,用户可以在其中创建" 旅行"模型,然后添加他的旅行步骤,我打电话给" 跟踪"。每个添加的跟踪都会打印 trip#show 操作中存在的地图的新部分。 模型之间的关联是用户has_many旅行和旅行has_many痕迹
在用户#show 中,我提出了一个"创建新旅行"链接到 trip #new 的按钮,这里我有form_for,其字段对应 Trip 属性。 当我正确填写表格时一切正常。当某些东西丢失或错误时(对于验证)我收到此错误:
NoMethodError in Trips#create
undefined method `model_name' for Array:Class
------在 trips_controller.rb
中def create
@trip = current_user.trips.build(params[:trip])
if @trip.save
# handle a successful save
flash[:success] = 'Trip created!'
redirect_to user_trip_path(@trip, user_id: current_user.id)
else
@trip = []
@feed_items = []
render 'new'
end
end
------在 app / views / trip 中的 new.html.erb
h1>Create a trip</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3 general-input">
<%= form_for ([current_user, @trip]) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name,'Give a name to your trip ;)' %>
<%= f.text_field :name %>
<%= f.label :trip_start, 'Choose your starting point!' %>
<%= f.text_field :trip_start %>
<%= f.label :departure, 'When are you leaving?' %>
<%= f.date_select :departure, :start_year => Date.current.year %>
<%= f.label :arrive, 'And coming back home?' %>
<%= f.date_select :arrive, :start_year => Date.current.year %>
<%= f.submit 'Create a new trip', class: 'btn btn-primary btn-lg' %>
<% end %>
编辑1:解决问题从trips_controller.rb删除@ trace = []
编辑2:
我在创建新Trace时遇到了类似的问题:
添加新跟踪的表单位于 trip#show 页面中。 当我尝试创建不遵守验证的跟踪时(例如,如果我将&#34; destination&#34;字段留空),我收到此错误:
NoMethodError in Posts#create
undefined method `any?' for nil:NilClass
当我在Trip页面上放置Traces的表单时,URL就像:
http://localhost:3000/users/2/trips/8
但是当我创建一个非valide Trace时,它会切换到如下路径:
http://localhost:3000/trips/8/posts
我想我在处理错误消息时做错了什么。我可能误解了一些东西,即使是因为我对Rails和网络编程都很陌生。
这里你是一些代码部分,希望它有助于理解我的错误:
------在 traces_controller.rb
中def create
@trip= Trip.find(params[:trip_id])
@trace = @trip.traces.create(params[:trace])
if @trace.save
flash[:success] = 'Trace created!'
redirect_to user_trip_path(@trip, user_id: current_user.id)
else
@trace=[]
render 'trips/show'
end
end
------在 app / views / shared 中的 add_trace_form.html.erb
<p>Complete your trip adding a route!</p>
<%= form_for ([@trip, @trip.traces.build]) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="block post-form">
<div class="field ">
<%= f.text_field :end, placeholder: 'Where are you going next?' %>
<%= f.label :arr_day, 'When?' %>
<%= f.date_select :arr_day, :start_year => Date.current.year %>
<%= f.submit 'Add route', class: 'btn btn-primary btn-landing' %>
</div>
</div>
<% end %>
------在 app / views / shared 中的 error_messages.html.erb
<% if object.errors.any? %>
<div id="error_explanation">
<div class="alert alert-error">
The form contains <%= pluralize(object.errors.count, "error") %>.
</div>
<ul>
<% object.errors.full_messages.each do |message| %>
<li>* <%= message %></li>
<% end %>
</ul>
</div>
<% end %>
------在 routes.rb
中resources :users do
resources :trips
end
resources :trips do
resources :traces
end
resources :traces
非常感谢
答案 0 :(得分:0)
我认为当你在渲染中的locales中传递f.object时,它传递数组而不是活动记录对象,&lt;%= render&#39; shared / error_messages&#39;,object:f.object%&gt ;。 您可以检查部分检查对象以及它具有哪个类。 尝试检查object.errors.inspect 尝试引用http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials