在用户的页面上,我有许多微博,我想添加评论表格和评论到每个微博。
我有三种模式:用户,微博,评论。
user.rb
class User < ActiveRecord::Base
has_many :microposts, dependent: :destroy
has_many :comments
endmicropost.rb
class Micropost < ActiveRecord::Base
belongs_to :user
has_many :comments, dependent: :destroy
endcomment.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
endcomments_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 %>每个微博都必须有自己的评论。在我的DB中,我有注释表
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
endmicroposts_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!他们都是对的
comments_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发布于 2012-03-12 15:32:25
尝试将当前的微信传递给注释部分
<%= 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发布于 2012-03-12 15:30:40
我会使用嵌套的资源来进行微博和routes.rb文件中的评论:
resources :microposts do
resources :comments
end然后,在您通过micropost_comments_path(@micropost) url助手访问的注释控制器中,您可以执行以下操作来在create操作中构建关联:
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对象,所以您可以直接获取记录。
https://stackoverflow.com/questions/9669221
复制相似问题