Rails 用户对电影的评论
Posted
技术标签:
【中文标题】Rails 用户对电影的评论【英文标题】:Rails User Comments on Movies 【发布时间】:2013-06-02 15:59:19 【问题描述】:我有三个脚手架
用户、评论和Movies
在我的应用程序中,我希望用户在Movies
上评论,不同的用户可以在Movie
页面上评论。
我将如何创建允许用户在电影上添加 cmets 然后在电影页面上显示所有 cmets 的关联代码?能否请您告诉我计算 cmets 的代码,显示有多少 cmets 并以整数显示
到目前为止我得到了什么
带有主题和正文的评论表 电影表 用户表
用户.rb
has_many: comments
电影.rb
has_many: comments
cmets.rb
belongs_to :users
belongs_to :movies
谢谢!
【问题讨论】:
到目前为止你得到了什么? 【参考方案1】:您需要的关联是告诉它们属于什么。因此您需要在模型中执行以下操作:
评论模型:
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :movie
end
用户模型:
class User < ActiveRecord::Base
has_many :comments
end
电影模型:
class Movie < ActiveRecord::Base
has_many :comments
end
您需要生成迁移以将外键列添加到注释表中。一旦你有了它,你需要做的就是通过他们的 id 将 cmets 附加到电影和用户。然后让他们在视图中显示 cmets:
<% @movie.comments.each do |comment| %>
<%= comment.text %>
<% end %>
编辑:要创建评论,您需要一个链接来添加新评论。在视图中:
<%= link_to 'New Comment', new_movie_comment_path(@movie) %>
这应该会将您带到新的评论视图及其表单。在表单中,您可以通过设置将用户与评论相关联的隐藏字段来将评论与用户相关联。在评论表单视图中:
<%= form_for(@comment) do |f| %>
<%= f.label :user %>
<%= f.hidden_field :comment, :user_id, current_user_id %>
<% end %>
最后一部分假设您有一个活动会话。
编辑 2:
在路由中,您可以将 cmets 资源嵌套在电影资源中:
resources :movies do
resources :comments
end
编辑 3:
在您的 cmets 控制器中,您必须将动作指向电影。在控制器中
class CommentsController < ApplicationController
before_filter :load_movie
private
def load_movie
@movie = Movie.find(params[:movie_id])
end
私有部分需要位于控制器的底部。完成后,更新操作以使用@movie。
def index
@comments = @movie.comments.all
end
为控制器中的显示、新建等操作执行此操作。在创建操作和更新操作中,您需要更新 html 重定向。
format.html redirect_to (@movie, @comment), notice: 'Comment was successfully created.'
和
format.html redirect_to (@movie, @comment), notice: 'Comment was successfully Updated.'
【讨论】:
是的,但是用户如何创建评论,然后将其添加到电影中 但是使用您刚刚编辑的这段代码,它会使评论属于电影吗? 使用movie_id,就像我们使用user_id一样 这已经在link_to中处理了。它为该特定电影创建一个movie.comment(id)。 @movie 是您正在使用的电影模型的特定实例。 在 routes.rb 中,new_movie_comment_path 是什么?【参考方案2】:你可能有:
class User < ActiveRecord::Base
has_many :comments, :dependent => :destroy
end
class Comment< ActiveRecord::Base
belongs_to :user
belongs_to :movie
end
class Movies< ActiveRecord::Base
has_many :comments, :dependent => :destroy
end
在您的观点中,您可以执行以下操作:
Number of comments : <%= @movie.comments.length %>
<% @movie.comments.each do |comment| %>
Pseudo : <%= comment.user.pseudo%>
Body : <%= comment.body %>
<% end %>
如果你从 Rails 开始,你应该看看这个tutorial。这对于基础知识来说太棒了;)
【讨论】:
如何让用户在电影页面上创建评论 有很多解决方案!你想用ajax动态添加评论吗?要管理用户身份验证,我建议您使用 gem Devise。之后,在您的评论控制器中,您可以执行以下操作:@comment = Comment.build(:body => params["body"], :user => current_user)【参考方案3】:在 users.rb 中
has_many :movies, through: :comments
在movies.rb中
has_many :users, through: comments
这被称为 has-many-through 关联。参考here。
计数:
number_of_comments = Comment.all.size
number_of_comments_on_a_movie = Movie.find(movie_id).comments.size
number_of_comments_by_a_user = User.find(user_id).comments.size
【讨论】:
以上是关于Rails 用户对电影的评论的主要内容,如果未能解决你的问题,请参考以下文章