Сохранение и извлечение модели

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

Это может показаться вопросом для начинающих, но это ставит меня в тупик. У меня есть модель пользователя и модель местоположения. Местоположение принадлежит пользователю, и у пользователя есть много местоположений. У меня есть местоположения, сохраненные как вложенный ресурс в моем файле routes.

Вот функция create в моем файле LocationsController:

   def create
    @user = User.find(params[:user_id])
    @location = @user.locations.build(params[:location])

    respond_to do |format|
      if @location.save
        format.html { redirect_to @user }
        format.js { 
          @locations = @user.locations
          render 'create' 
        }
      else
        format.html { render @user }
        format.js
      end
    end
  end
  

create.js.erb:

 $('table#locations').html("<%= escape_javascript(render(@locations)) %>");
  

_location.html.erb:

 <tr>
  <td><%= location.user.name %></td>
  <td><%= location.created_at %></td>
  <td><%= location.longitude %></td>
  <td><%= location.latitude %></td>
</tr>
  

Сохранение в базу данных с использованием AJAX работает без проблем. Однако, когда запись извлекается, последняя строка возвращаемой таблицы содержит только имя пользователя. created_at, долгота и широта не отображаются. Если я обновляю страницу, они отображаются. Есть ли у кого-нибудь идеи, почему это может происходить?

Спасибо.

Обновить

Я изменил порядок моделей на противоположный, и по-прежнему не печатается нижняя запись. Я предполагаю, что это как-то связано с представлениями, а не с моделями.

Ответ №1:

Я думаю, что проблема может возникнуть, когда вы инициализируете свою переменную @locations в контроллере для ответа AJAX. Вы сохраняете новое местоположение, но, возможно, объект @user этого не замечает. Вместо

 @locations = @user.locations
  

попробуйте

 @locations = Location.where(:user_id => @user)
  

или что-то в этом роде, что гарантирует, что вы извлекаете местоположения из базы данных.

Это предположение!

Комментарии:

1. Это хорошее предложение, но оно не сработало. В любом случае спасибо за ответ.

2. хорошо, вы можете записать содержимое @locations в консоль / журнал с контроллера? Вы должны определить, есть ли данные на самом деле. Если это так, то вы знаете, что это проблема с вашим представлением (в чем я сомневаюсь, потому что ваш код представления кажется довольно простым).

3. Что ж, вы правы. Когда я регистрирую данные с контроллера, в последней записи отсутствуют соответствующие данные. Он гласит#<Идентификатор местоположения: ноль, долгота: ноль, широта: ноль, идентификатор пользователя: 1, created_at: ноль, updated_at: ноль>. Странная часть в том, что я проверяю наличие долготы и широты в моей модели местоположения.

4. Думая об этом, я также не могу понять, почему эта запись отображается в разделе @user.locations, когда в ней явно отсутствует идентификатор пользователя.

5. вы убедились, что параметры [:location] указаны правильно и полно?

Ответ №2:

Поскольку вы получаете свою пользовательскую запись из базы данных перед сохранением нового местоположения, возможно, она не извлекает новое местоположение. Возможно, вызов user.reload перед отображением представления. Или ожидание выполнения User.find до тех пор, пока вы не сохраните местоположение.