Простой вопрос Ruby on Rails - как прикрепить комментарии как к пользователям, так и к статьям? - PullRequest
5 голосов
/ 29 марта 2011

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

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

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

Отношения для класса 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

Это мой CommentsController (страница about визуализируется в остальном, чтобы сделать это для меня очевидным):

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

Ответы [ 2 ]

9 голосов
/ 29 марта 2011

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

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

resources :articles do
  resources :comments
end

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

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

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

0 голосов
/ 29 марта 2011

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

...