我有一个Post模型和一个属于Post的Comment模型。我能够在家庭视图中显示与家庭控制器和主页操作以及用户/节目视图相对应的帖子。因此,在家庭和用户视图中,按照创建时间的顺序列出帖子。我还能够在用户和家庭视图中都有一个帖子表格。
当我尝试在主视图和用户视图中的每个显示的帖子下面显示评论表单时出现问题。 home controller / home action已经显示了一个变量@post用于显示的新帖子,这使得很难为要创建的注释启动另一个post实例变量。评论表格应位于相应文章的下方,从而为该文章创建评论。
如何在主视图中实现此功能?如何启动处理评论表单所需的帖子和评论变量?
这是我的主页视图:app / views / home / home.html.erb:
<% if logged_in? %>
<div class="row">
<aside class="col-md-4">
<section class="user_info">
<%= render 'shared/user_info' %>
</section>
<hr/>
<br/>
<section class="stats">
<%= render 'shared/stats' %>
</section>
<section class="post_form">
<%= render 'shared/post_form' %>
</section>
</aside>
<div class="col-md-8">
<h3>Post Feed</h3>
<%= render 'shared/feed' %>
</div>
</div>
<% else %>
<div class="center jumbotron">
<h1>Welcome to the Unstarv website</h1>
<h2>
Please sign up now to use this site
<%= link_to "Sign Up", signup_path =%>
now.
</h2>
<%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %>
</div>
<%= link_to image_tag("rails.png", alt: "unstarv logo"),
'#' %>
<% end %>
这是我的家庭控制员:
class HomeController < ApplicationController
def home
if logged_in?
@post = current_user.posts.build
@feed_items = current_user.feed.paginate(page: params[:page])
end
end
def about
end
def privacy
end
def terms
end
end
这是我的Post模型,相关部分:
class Post < ActiveRecord::Base
belongs_to :user
has_many :comments
default_scope -> { order(created_at: :desc) }
mount_uploader :picture, PictureUploader
end
我的用户模型的相关部分:
class User < ActiveRecord::Base
attr_accessor :remember_token
before_save { self.email = email.downcase }
has_many :posts, dependent: :destroy
has_many :comments
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
has_many :passive_relationships, class_name: "Relationship",
foreign_key: "followed_id",
dependent: :destroy
has_many :following, through: :active_relationships, source: :followed
has_many :followers, through: :passive_relationships, source: :follower
validates :username, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, length: { minimum: 6 }, allow_blank: true
def feed
following_ids = "SELECT followed_id FROM relationships
WHERE follower_id = :user_id"
Post.where("user_id IN (#{following_ids})
OR user_id = :user_id", user_id: id)
end
end
这是我的评论模型:
class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :user
default_scope -> { order(created_at: :desc) }
end
这是帖子控制器:
class PostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
def index
@posts = Post.all
end
def show
@post = Post.find(params[:id])
@comment = Comment.new
@comment.post_id = @post.id
@comments = @post.comments.all
end
def new
@post = Post.new
end
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = "Post created!"
redirect_to root_url
else
@feed_items = []
render 'home/home'
end
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
@post.update(post_params)
flash.notice = "Post '#{@post.title}' Updated!"
render 'home/home '
end
def update
@post = Post.find(params[:id])
@post.update(post_params)
flash.notice = "Post '#{@post.title}' Updated!"
redirect_to root_url
end
private
# Use callbacks to share common setup or constraints between actions.
def set_post
@post = Post.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def post_params
params.require(:post).permit(:title, :body, :picture)
end
end
这是我的app / views / post / _post.html.erb文件,
<li id="post-<%= post.id %>">
<span class="user"><%= link_to post.user.username, post.user %></span>
<span class="content">
<%= post.title %>
<%= post.body %>
<%= image_tag post.picture.url if post.picture? %>
</span>
<span class="timestamp">
Posted <%= time_ago_in_words(post.created_at) %> ago.
<% if current_user?(post.user) %>
<%= link_to "delete", post, method: :delete,
data: { confirm: "You sure?" } %>
<% end %>
</span>
<section>
<h2>Your Comments here</h2>
<h3>Post a Comment</h3>
<h3>Post a Comment</h3>
<%= render 'shared/comment_form' %>
<% post.comments.all.each do |comment| %>
<h4><small>Comment by</small> <%= comment.post.user.username %></h4>
<p class="comment"><%= comment.body %></p>
<p><small>Posted <%= distance_of_time_in_words(Time.now, comment.created_at) %> ago</small></p>
<br/>
<%end%>
</li>
这是我的app / views / shared / comment_form_html.erb,由于实例变量未正确初始化,这似乎是问题的一部分:
<%= form_for [ @post1, @comment] do |f| %>
<p>
<%= f.label :body, "Your Comment" %><br/>
<%= f.text_area :body %>
</p>
<p>
<%= f.submit 'Submit' . method="post", class: 'btn btn-primary' %>
</p>
<% end %>
最后这是我的追踪:
actionview (4.1.8) lib/action_view/helpers/form_helper.rb:423:in `form_for'
app/views/shared/_comment_form.html.erb:1:in `_app_views_shared__comment_form_html_erb__972919349_34226064'
actionview (4.1.8) lib/action_view/template.rb:145:in `block in render'
activesupport (4.1.8) lib/active_support/notifications.rb:161:in `instrument'
actionview (4.1.8) lib/action_view/template.rb:339:in `instrument'
actionview (4.1.8) lib/action_view/template.rb:143:in `render'
actionview (4.1.8) lib/action_view/renderer/partial_renderer.rb:306:in `render_partial'
actionview (4.1.8) lib/action_view/renderer/partial_renderer.rb:279:in `block in render'
actionview (4.1.8) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
activesupport (4.1.8) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.1.8)lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.1.8) lib/active_support/notifications.rb:159:in `instrument'
actionview (4.1.8) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'
actionview (4.1.8) lib/action_view/renderer/partial_renderer.rb:278:in `render'
actionview (4.1.8) lib/action_view/renderer/renderer.rb:47:in `render_partial'
actionview (4.1.8) lib/action_view/helpers/rendering_helper.rb:35:in `render'
app/views/posts/_post.html.erb:22:in `_app_views_posts__post_html_erb__365860364_28803540'
actionview (4.1.8) lib/action_view/template.rb:145:in `block in render'
activesupport (4.1.8) lib/active_support/notifications.rb:161:in `instrument'
actionview (4.1.8) lib/action_view/template.rb:339:in `instrument'
actionview (4.1.8) lib/action_view/template.rb:143:in `render'
actionview (4.1.8) lib/action_view/renderer/partial_renderer.rb:399:in `block in collection_with_template'
actionview (4.1.8) lib/action_view/renderer/partial_renderer.rb:395:in `map'
非常感谢你的帮助!!!!
答案 0 :(得分:1)
_post.html.erb
中,使用<%= render 'shared/comment_form' %>
render 'shared/comment_form', post: post
然后在_comment_form_html.erb
中,使用[@post1, @comment]
[post, @comment]
修改强>
您还需要将以下行添加到HomeController#home
@comment = Comment.new
修改强>
问题/问题是如何生成要在每个评论表单中使用的实例,对吧?
由于您正在迭代每个帖子<%= render 'shared/feed' %>
,您已经有帖子后实例,您正在app/views/post/_post.html.erb
中访问此实例,实例名称为post
当您尝试渲染comment_form
时,您可以将参数传递给render
方法,您可以发送一个名为locals
的参数,或者只是将参数发送为name=value
是一个shorcut。
如果您呈现comment_form
发送当前post
,那么您可以根据该帖子生成表单。
因为现在您可以post
访问shared/_comment_form.html.erb
,当前的问题是如何生成comment
实例,一种方法是在每个要显示的控制器操作中实例注释feed(如果在多个位置使用它是一个糟糕的选项),这就是我在评论中说的(我的坏)。我认为最好的选择是使用[@post1, @comment]
[post, post.comments.build]
(您的原始解决方案)
它将如何运作?由于您已有权访问post
,因此您只需在视图中为post
创建一个空评论