微博在用户页面上的评论(Ruby on Rails)

Posted

技术标签:

【中文标题】微博在用户页面上的评论(Ruby on Rails)【英文标题】:Micropost's comments on users page (Ruby on Rails) 【发布时间】:2012-03-28 23:30:35 【问题描述】:

在用户页面上我有很多微博,我想为每个微博添加评论表单和 cmets。

我有三个模型:用户、微博、评论。

user.rb

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  has_many :comments
end

micropost.rb

class Micropost < ActiveRecord::Base
  belongs_to :user
  has_many :comments, dependent: :destroy
end

comment.rb

class Comment < ActiveRecord::Base
  attr_accessible :comment_content

  belongs_to :user
  belongs_to :micropost

  validates :comment_content, presence: true
  validates :user_id, presence: true
  validates :micropost_id, presence: true  
end

cmets_controller.rb

class CommentsController < ApplicationController

  def create
    @comment = current_user.comments.build(params[:comment])
    if @comment.save
       flash[:success] = "Comment created!"
       redirect_to current_user
    else
      render 'shared/_comment_form'
    end
  end
end

_micropost.html.erb

<tr>
  <td class="micropost">
    <span class="content"><%= wrap(micropost.content) %></span>
    <span class="timestamp">
      Posted <%= time_ago_in_words(micropost.created_at) %> ago.    
    </span>
    <%= render 'shared/comment_form' %>
   </td>
</tr>

意见表

<%= form_for(@comment) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :comment_content %>
  </div>
  <button class="btn" type="submit">
    Create
  </button>
<% end %>

每个微博都必须有自己的 cmets。 在我的数据库中,我有带有

的评论表

id/comment_content/user_id/micropost_id

列。

评论未创建,因为 RoR 无法理解这条新评论属于哪个微博。 我应该怎么做才能在我的数据库中拥有所有需要的信息?

更新

users_controller

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
    @comment = Comment.new
  end

microposts_controller

  def create
    @micropost = current_user.microposts.build(params[:micropost])
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to current_user
    else
      render 'shared/_micropost_form'
    end
  end

解决方案!!!

非常感谢 carlosramireziii 和 Jon!他们都是对的

cmets_controller

  def create
    @micropost = Micropost.find(params[:micropost_id])
    @comment = Comment.new(params[:comment])
    @comment.micropost = @micropost
    @comment.user = current_user
    if @comment.save
       flash[:success] = "Comment created!"
       redirect_to current_user
    else
      render 'shared/_comment_form'
    end
  end

_micropost.html.erb

<%= render 'shared/comment_form', micropost: micropost %>

意见表

<%= form_for([micropost, @comment]) do |f| %>

routes.rb

resources :microposts do
  resources :comments
end

【问题讨论】:

呈现这些视图的控制器操作是什么? 我已经用微博和用户控制器更新了我的问题 【参考方案1】:

尝试将当前微博传递到评论部分

<%= render 'shared/comment_form', micropost: micropost %>

然后将微博添加到评论form_for调用

<%= form_for([micropost, @comment]) do |f| %>

确保您的路线是嵌套的

# in routes.rb
resources :microposts do
  resources :comments
end

然后在CommentsController的微博上建立评论

def create
  @micropost = Micropost.find(params[:micropost_id])
  @comment = @micropost.comments.build(params[:comment])
  ...
end

【讨论】:

感谢帮助,但出现错误“未定义的局部变量或方法`micropost'”【参考方案2】:

我会在你的 routes.rb 文件中为 micropost 和 cmets 使用嵌套资源:

resources :microposts do
  resources :comments
end

然后在您通过micropost_comments_path(@micropost) url 助手访问的 cmets 控制器中,您可以执行以下操作以在创建操作中建立关联:

def create
  @micropost = Micropost.find(params[:micropost_id])
  @comment = Comment.new(params[:comment])
  @comment.micropost = @micropost
  @comment.user = current_user

  if @comment.save
    ...
end

您可以使用 merge 方法减少代码行数,但我发现这有时会降低代码的可读性,而且如果在验证错误后重新显示表单,您可能需要 @micropost 对象好吧,只是获取记录。

【讨论】:

感谢您的回答,但现在我有一个错误“找不到没有 ID 的微博”。

以上是关于微博在用户页面上的评论(Ruby on Rails)的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 实时活动通知

如何使用用户定义的字段数制作表单? - Ruby on Rails

Ruby on Rails全栈课程3.8 权限管理之超级管理员审批功能实现

Ruby on Rails Tutorial 第二章

继续:Ruby on Rails 简单了解

ruby 使用Devise gem验证您的API,使用标头标记。 Ruby on Rails 4.阅读评论。