Хобрук: Ваш путь к мастерству в программировании

Проблемы с получением профиля для обновления и отображения недавно отправленного элемента формы

В ответ на предыдущий вопрос я есть несколько проблем, которые нужно решить, прежде чем я смогу безопасно отображать и отправлять форму комментария в своем профиле. Я новичок в программировании, поэтому размышления о нескольких контроллерах, похоже, меня запутали.

Что я делаю, так это размещаю комментарии в форме, а затем перечисляю их.

Предыстория: _comment_form и _comment находятся как частичные части в Profile about. (Моя следующая задача — переключиться с информации о профиле на другую, но это еще один вопрос вообще.)

Используя помощь, предоставленную в моем последнем вопросе, я чувствую, что почти у цели, но получаю сообщение об ошибке.

Миграция CreateComments:

t.integer :profile_id
t.integer :author_id
t.string :body

Модель моего комментария:

class Comment < ActiveRecord::Base
  belongs_to :profile
  belongs_to :author, :class_name =>"User", :foreign_key => "author_id"
end

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

def create
  @comment = Comment.new(params[:comment].merge(:author_id => current_user.id))
  @comment.save!
  redirect_to profile_path(@comment.profile)
end

Контроллер профилей:

def create
  @profile = Profile.new(params[:profile])
  if @profile.save
    redirect_to profile_path(@profile), :notice => 'User successfully added.'
  else
    render :action => 'new'
  end
end

def show
  @user = User.find(params[:id])
  @profile = @user.profile
  @comment = @profile.comments.new
end

Партиалы комментариев внутри партиала профиля:

<div id="commentEntry">
  <%= render :partial => 'comment', :collection => @profile.comments %>
</div>
<div id="newitem">
  <%= render :partial => 'comment_form' %>
</div>

Маршруты.рб:

resources :users do
  resources :profiles
end
resources :comments

_comment_form.html.erb:

<%= form_for @comment do |f| %>
  <%= f.text_field :body %>
  <%= f.submit 'Add new' %>
<% end %>

_comment.html.erb:

<li class="comment" title="<%= @comment.author.profile.first_name %> <%= @comment.author.profile.last_name %>">
  <%= @comment.body %>
</li>

Итак, проблема №1: объединение _comment.html.erb в цикле <% for @comment in @user.profile.comments %> показывает профиль, но когда я пытаюсь отправить новый комментарий, я получаю сообщение "Неизвестное действие. Не удалось найти действие "обновить" для контроллера комментариев". Если я убираю цикл, профиль не отображается, и я получаю «NoMethodError in Profiles#show undefined method `profile' for nil: NilClass». Может ли кто-нибудь помочь мне и объяснить, что я делаю неправильно?

Проблема № 2. Я создал пример комментария в rails console, и когда я получаю отображение профиля, поле ввода для комментария :body повторно заполняется телом комментария. Любые идеи о том, что может происходить?

03.09.2011

Ответы:


1

Краткое объяснение вашей проблемы:

@comment, которое вы получаете в партиале _comment_form, уже сохранено в вашей базе данных, следовательно, вызов действия update и уже заполненное тело.

Вы прекрасно создаете новый комментарий с помощью @comment = @profile.comments.new в действии show, но он переопределяется где-то еще.

Вы упомянули, что зациклили рендер _comment с <% for @comment in @user.profile.comments %>, проблема, скорее всего, в нем.

Исправить:

Единственное, что вам нужно изменить, это частичный _comment (без добавленного вами цикла for):

<li class="comment" title="<%= comment.author.profile.first_name %> <%= comment.author.profile.last_name %>">
  <%= comment.body %>
</li>

Когда вы делаете render :partial => 'comment', :collection => @profile.comments, рельсы достаточно умны, чтобы зациклиться на @profile.comments и передать переменную comment (не @comment) партиалу.

Как избежать этого в следующий раз:

Я дам вам два эмпирических правила, чтобы не попасть в такую ​​ситуацию:

  1. Попробуйте назвать свои переменные более точно. @new_comment было бы лучшим именем для переменной для хранения нового комментария. @comment немного двусмыслен, так как у вас их полно.

  2. Избегайте создания и изменения переменных экземпляра (@ переменных) в ваших представлениях, старайтесь делать это только в своем контроллере. Я признаю, что ваш конкретный случай было немного сложнее обнаружить из-за <% for @comment in @user.profile.comments %>. Представление получило свое название по уважительной причине, оно предназначено только для того, чтобы вы могли просматривать данные, которые вы определили в своем контроллере.

Надеюсь это поможет.

03.09.2011
  • Спасибо за отличное объяснение устранения неполадок! 04.09.2011
  • Спасибо, надеюсь помогло. Лаконичное решение иногда может больше навредить, чем помочь, надеюсь, я выразился достаточно ясно. 04.09.2011
  • Определенно. Думаю, ясно, что мне нужно углубиться в некоторые основы Rails. 04.09.2011
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..