【问题标题】:Easy Ruby on Rails question -- how to attach comments to both users and articles?简单的 Ruby on Rails 问题——如何将评论附加到用户和文章?
【发布时间】:2011-03-29 03:48:30
【问题描述】:

我意识到这可能是一个非常基本的问题,但我已经花了好几天的时间才回到这个问题上,由于某种原因,Google 并没有帮助我。 (我认为部分问题在于我是一个初学者,我不知道该问什么......)我还查看了 O'Reilly 的 Ruby Cookbook 和 Rails API,但我仍然坚持这个问题.我找到了一些关于多态关系的信息,但这似乎不是我所需要的(尽管如果我错了请告诉我)。

我正在尝试调整 Michael Hartl's tutorial 以创建一个包含用户、文章和 cmets 的博客应用程序(不使用脚手架)。我希望 cmets 既属于用户又属于文章。

我的主要问题是:我不知道如何将当前文章的 id 获取到 cmets 控制器中。

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(关于页面呈现在 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

当我以用户身份登录并尝试对文章创建评论时,我收到“找不到没有 ID 的文章”。我不知道如何将当前文章的 id 获取到 cmets 控制器中。

谢谢,如果您需要我发布更多代码,请告诉我。

编辑:这是我在文章的 show.html.erb 视图底部调用的 _comment_form.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' %>

【问题讨论】:

  • 你能不能过去你的代码,即你的视图有创建评论的形式
  • 请发表您的评论表声明。
  • 另外,为了更好地测试您的关联,请尝试使用 Rails 控制台。真是天赐之物!

标签: ruby-on-rails ruby ruby-on-rails-3 rails-activerecord


【解决方案1】:

我同意你的观点,多态不是你想要的。我认为你目前的联想看起来不错。

我假设在您的 routes.rb 中有这样的设置。如果我错了,请纠正我:

resources :articles do
  resources :comments
end

但如果是这种情况,您应该将 CommentsController 中的创建操作更改为使用 params[:article_id] 而不是 params[:id]

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

这应该可以解决它无法找到没有 ID 的文章的问题

【讨论】:

  • 谢谢!那解决了它。太棒了,我太高兴了!我没有足够的声誉来投票支持您的评论,但这是我需要的正确答案。
【解决方案2】:

阅读polymorphic associations,我认为它们对您的情况非常有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 2012-12-31
    • 2010-12-18
    • 2019-09-21
    • 2016-04-17
    • 2015-07-06
    • 2023-03-02
    • 2023-04-03
    相关资源
    最近更新 更多