Проблемы с получением профиля для обновления и отображения вновь отправленного элемента формы - PullRequest
0 голосов
/ 03 сентября 2011

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

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

Фон: _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

CommentsController:

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

ProfilesController:

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>

routes.rb:

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 %> показывает профиль, но когда я пытаюсь отправить новый комментарий, я получаю "Неизвестное действие" Не удалось выполнить действие "обновление" найти для CommentsController ". Если я уберу цикл, профиль не отобразится, и я получу «NoMethodError в профилях # показать неопределенный метод« профиль »для nil: NilClass». Кто-нибудь может мне помочь и объяснить, что я делаю неправильно?

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

1 Ответ

1 голос
/ 03 сентября 2011

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

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

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

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

Fix:

Единственное, что вам нужно изменить, это частичное _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 ( not @comment) в парциальное.

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...