Ruby On Rails - создание объекта не учитывает проверки и показывает сообщения об ошибках

У меня проблемы с обработкой объектов, которые не соответствуют действительности. Я создаю приложение, в котором пользователь может создать модель " Поездка ", а затем добавить шаги в свое путешествие, которое я назвал " Следы ". Каждая добавленная трасса печатает новую часть карты, присутствующую в действии trip#show. Связь между моделями - это пользователь has_many trips и trip has_many traces

В # user show я поместил кнопку "CREATE NEW TRIP", ссылающуюся на trips # 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: решение проблемы удаления @trace=[ ] из trips_controller.rb


РЕДАКТИРОВАТЬ 2:

У меня также есть похожая проблема с созданием новой трассировки:

Форма для добавления новой трассы находится на странице trip#show. Когда я пытаюсь создать трассировку, которая не соответствует проверке (например, если я оставляю пустым поле "назначение"), я получаю эту ошибку:

NoMethodError in Posts#create
undefined method `any?' for nil:NilClass

Когда я нахожусь на странице Поездки, где размещена форма для Трассировок, URL выглядит так:

 http://localhost:3000/users/2/trips/8

но когда я создаю не валидную трассировку, она переключается на путь вроде:

 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 %>

------ в маршрутах.

resources :users do  
  resources :trips
end

resources :trips do
  resources :traces
end

resources :traces

большое спасибо

1 ответ

Я думаю, что когда вы передаете f.object в локалях в render, он передает массив, а не активный объект записи,<% = render 'shared / error_messages', object: f.object%>. Можете ли вы проверить объект проверки в вашей части и какой класс он имеет. Попробуйте проверить object.errors.inspect Попробуйте изменить http://guides.rubyonrails.org/layouts_and_rendering.html

Другие вопросы по тегам