我有一个模型,我想发表评论。我很难在模型的“显示”视图上创建一个允许创建评论的表单。我没有找到任何好的或有用的例子。谁能指出我或向我展示如何执行此操作的示例?
例子:
一个简单的博客应用程序。我有一个名为 Post 的模型。这是可以评论的。因此,在“显示”视图中,我想显示一个帖子,并且在底部有字段,当完成并提交时,创建一个与帖子关联的新评论并将其放入数据库中。
听起来很简单,我让它工作,所以我可以显示我已经播种的评论。我只是无法获得一个表格来放入新的表格。感谢任何帮助。
我有一个模型,我想发表评论。我很难在模型的“显示”视图上创建一个允许创建评论的表单。我没有找到任何好的或有用的例子。谁能指出我或向我展示如何执行此操作的示例?
例子:
一个简单的博客应用程序。我有一个名为 Post 的模型。这是可以评论的。因此,在“显示”视图中,我想显示一个帖子,并且在底部有字段,当完成并提交时,创建一个与帖子关联的新评论并将其放入数据库中。
听起来很简单,我让它工作,所以我可以显示我已经播种的评论。我只是无法获得一个表格来放入新的表格。感谢任何帮助。
让我们假设一个 Post 模型。确保,你有
class Post < ActiveRecord::Base
acts_as_commentable
end
然后在说 Post#show 的视图中
<%= form_tag "/posts/add_new_comment" do %>
<%= hidden_field_tag "id", post.id %>
<%= text_area_tag "comment[comment]" %>
<%= submit_tag "Post Comment" %>
<% end %>
然后在 PostController
def add_new_comment
post = Post.find(params[:id])
post.comments << Post.new(params[:comment])
redirect_to :action => :show, :id => post
end
并在 routes.rb
match "/posts/add_new_comment" => "posts#add_new_comment", :as => "add_new_comment_to_posts", :via => [:post]
希望这能让你启动并运行。
这是非常非常基本的东西,你显然需要一些更好的结构和方法来学习。购买一本书,例如Agile Web Development with Rails,是唯一真正的学习方式,否则你会从一个问题到另一个问题徘徊,而没有真正学好任何东西。
假设您有一篇要评论的帖子。
#routes.rb
map.resources :posts do |post|
post.resources :comments
end
#post_controller.rb
def show
@post.find params[:id]
@comment = @post.comments.new
end
#posts/show.html.erb
<%- form_for [@post, @comment] do |f|-%>
<%= f.text_area :body -%>
<%= f.submit -%>
<%- end -%>
#comments_controller
def create
@post = @post.find params[:post_id]
@comment = @post.comments.new params[:comment]
if @comment.save
redirect_to @post
这是一个老问题,但我想提出我的解决方案,以及 gem 的自述文件在这些年之后仍然没有帮助。它建立在@Kunday 的回答之上。以下将是使用 act_as_commentable gem 的教程...
这假设您已经有一个工作“博客”,无论是图片还是帖子。安装 gem,然后运行rails g comment
开始。
允许用户在每个帖子下创建评论。
首先,在要使用可注释 gem 的模型中,按照 gem 的 README 中的建议添加以下行。
class Post < ActiveRecord::Base
acts_as_commentable
end
然后使用该操作创建一个新的评论控制器create
。请注意,这:authenticate_user!
是设计的一部分,它是用于创建简单身份验证的宝石。current_user
也是作为助手的设计的一部分。如果您想在评论正文下显示用户的姓名/电子邮件,则需要它。
class CommentsController < ApplicationController
before_action :authenticate_user!
def create
post = Post.find_by(id: params[:id])
comment = post.comments.build(comment_params)
comment.user = current_user
if comment.save
flash[:notice] = "Comment has been created."
redirect_to post
else
flash[:alert] = "Comment has not been created."
end
end
private
def comment_params
params.permit(:comment)
end
end
接下来,设置路线。就是这个。这意味着当有人向评论发送帖子请求时,我们将在评论控制器中运行创建操作。
post 'comments' => 'comments#create', as: "create_comment"
给as: "create_comment"
它一个别名,所以你可以做create_comment_path
. 现在,在 Post 的显示视图中,我们将添加表单。div 将帮助您添加 css。
<div class="comment-section">
<%= form_tag create_comment_path, method: "post" do %>
<%= hidden_field_tag "id", @post.id %>
<%= text_area_tag :comment %>
<%= submit_tag "Submit" %>
<% end %>
</div>
现在在 Post show 视图下显示每条评论。
div 将帮助您添加 css,comment.user.name
如果您的 User 类有一个名称列,它将起作用。否则,将其更改为email
或您选择使用的任何标识符。
<div class="comment_list">
<% @comments.each do |comment| %>
<%= comment.comment %> <br>
<%= comment.user.name %> <br>
<br>
<% end %>
</div>
最后,为了让 @comments 在显示页面中存在,请转到您的 Post 控制器,并在显示下添加以下内容:
def show
@post = Post.find_by(id: params[:id])
@comments = @post.comments.all
end
这应该对要求有好处。祝你好运。