Легкий вопрос Ruby on Rails, как прикреплять комментарии к пользователям и статьям?

Я понимаю, что это, вероятно, очень простой вопрос, но я провел несколько дней, возвращаясь к нему, и по какой-то причине Google мне просто не помогает. (Я думаю, что часть проблемы в том, что я такой новичок, что не знаю, что спросить...) Я также просмотрел Ruby Cookbook O'Reilly и API Rails, но я все еще застрял в этом вопросе. . Я нашел некоторую информацию о полиморфных отношениях, но похоже, что это не то, что мне нужно (хотя дайте мне знать, если я ошибаюсь).

Я пытаюсь настроить руководство Майкла Хартла, чтобы создать приложение блога с пользователями, статьями и комментариями (без использования шаблонов) . Я хочу, чтобы комментарии принадлежали как пользователю, так и статье.

Моя основная проблема: я не могу понять, как получить идентификатор текущей статьи в контроллере комментариев.

Отношения для класса User:

class User < ActiveRecord::Base

has_many :articles
has_many :comments, :dependent => :destroy

Отношения для класса Article:

class Article < ActiveRecord::Base

belongs_to :user
has_many :comments, :dependent => :destroy

Отношения для класса Comment:

class Comment < ActiveRecord::Base

belongs_to :user
belongs_to :article

Это мой CommentController (страница about отображается в else просто для того, чтобы сделать это очевидным для меня на данный момент):

class CommentsController < ApplicationController
before_filter :authenticate, :only => [:create, :destroy]

def new
  @comment = Comment.new
end

def create
  @article = Article.find(params[:id])
  @comment = current_user.comments.build(params[:comment])
  @comment.article_id = @article.id
  if @comment.save
    flash[:success] = "Comment created!"
    redirect_to '/contact'
  else
    render '/about'
  end
end

def destroy
end
end

Когда я вхожу в систему как пользователь и пытаюсь создать комментарий к статье, я получаю сообщение «Не удалось найти статью без идентификатора». Я не могу понять, как получить идентификатор текущей статьи в контроллере комментариев.

Спасибо и дайте мне знать, если вам нужно, чтобы я разместил больше кода.

Изменить: вот мой частичный файл _comment_form.html.erb, который я вызываю в нижней части представления show.html.erb для статьи:

<%= form_for ([@article, @article.comments.build]) do |f| %>
  <div class="field">
    <%= f.text_area :content %>
  </div>
  <div class="actions">
    <%= f.submit "Submit" %>
  </div>
<% end %>

Также вот show.html.erb для статьи:

<heading>
  <h1><%= @article.heading %></h1>
  <p>Posted <%= time_ago_in_words(@article.created_at) %> ago by <%= @article.user.name %></p>
</heading>
<p><%= @article.content %></p>
<footer><p>
  <% unless @article.comments.empty? %>
    <%= @article.comments.count %>
  <% end %> comments</p></footer>
<% unless @article.comments.empty? %>
  <%= render @comments %>
  <%= will_paginate @comments %>
<% end %>
<%= render 'shared/comment_form' %>

person Kelly    schedule 29.03.2011    source источник
comment
можете ли вы пропустить свой исходный код, то есть ваше представление, в котором есть форма для создания комментария   -  person Naren Sisodiya    schedule 29.03.2011
comment
Разместите объявление в форме комментария, пожалуйста.   -  person raidfive    schedule 29.03.2011
comment
Кроме того, чтобы лучше проверить свои ассоциации, попробуйте использовать консоль Rails. Находка для таких вещей!   -  person Damien Roche    schedule 19.06.2012


Ответы (2)


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

Я предполагаю, что в вашем route.rb у вас есть что-то вроде этого. Поправьте меня если я ошибаюсь:

resources :articles do
  resources :comments
end

Но если это так, вы должны изменить действие создания в вашем CommentController, чтобы использовать params[:article_id] вместо params[:id]

@article = Article.find(params[:article_id])

Это должно решить проблему, когда он не может найти статью без идентификатора.

person DanneManne    schedule 29.03.2011
comment
Благодарю вас! Это исправило это. Удивительно, я так счастлив! У меня недостаточно репутации, чтобы проголосовать за ваш комментарий, но это правильный ответ на то, что мне нужно. - person Kelly; 29.03.2011

Почитайте о полиморфных ассоциациях, я думаю, они будут очень полезны в вашем случае.

person Dmitry Maksimov    schedule 29.03.2011