在嵌套我的社区和评论方面感到困惑

时间:2015-10-23 22:53:52

标签: ruby-on-rails ruby-on-rails-4 model-view-controller controller nested

我将有一个选项,评论模型可以用于在个人资料页面和社区页面中发布用户。目前我正在从事社区工作,并希望得到一些指导,因为我很困惑。

我得到的当前错误是我的CommentsController#Create的ActiveModel :: ForbiddenAttributesError。希望尽可能提供帮助,或者帮助我指出修复错误的方向。

关于人们看到评论的观点的问题是/ communities / show

模型

用户

has_one :profile
has_many :communities
has_many :comments, dependent: :destroy

社区

extend FriendlyId
 friendly_id :title, use: [:slugged, :finders]

has_many :comments, dependent: :destroy
belongs_to :user

注释

belongs_to :user
belongs_to :community

路线

resources :communities do
 resources :comments
end

控制器

社区

def show
 @community = Community.friendly.find(params[:id])
 @current_user = User.find(session[:user_id])
 @comment = Comment.new
end

评论

 before_filter :load_community
 def create
  @comment = @community.comments.build(params[:comment])
  @comment.user_id = current_user.id
  if @comment.save
   redirect_to :back
  else
   redirect_to "/"
  end

  # @comment = Comment.new(comment_params)
  # @comment.user_id = session[:user_id]

  # if @comment.save && @comment.community_id
  #   flash[:notice] = "Comment has been posted"
  # else
  #   flash[:alert] = @comment.errors.full_messages
  # end
end

private
def load_community
 @community = Community.friendly.find(params[:community_id])
end

def comment_params
 params.require(:comment).permit(:text, :user_id, :community_id, :profile_id)
end

视图

/社区/显示

<%= render "profiles/index" %>
<h4><%= @community.title.capitalize! %></h4>
<%= @community.bio %>


<%= render "comments/new" %>   

/评论/ _new

<%= form_for ([@community, @comment])  do |f| %>
 <%= f.text_area :text, placeholder: "Enter New Comment Here ...", :cols => 50, :rows => 3, :class => 'text_field_message', :id => 'new_comment' %>
 <%= f.submit :class => 'new_comment_button' %>
<% end %>

感谢所有帮助解释我犯错误的人,如果我可能需要问你可能要求我提出什么,请提前对不起。如有其他问题,请询问。

更新

我在控制台中看到的是

Started POST "/communities/dang/comments" for 127.0.0.1 at 2015-10-23 18:38:47   -0400
Processing by CommentsController#create as HTML
Parameters: {"utf8"=>"✓",   "authenticity_token"=>"us8KNTLUZUdao13GK4OQId0YoUqf+CeLFIGjydnyWtI=", "comment"=>  {"text"=>"www"}, "commit"=>"Create Comment", "community_id"=>"dang"}
Community Load (0.1ms)  SELECT  "communities".* FROM "communities"  WHERE  "communities"."slug" = 'dang'  ORDER BY "communities"."id" ASC LIMIT 1
Completed 500 Internal Server Error in 11ms

ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
app/controllers/comments_controller.rb:17:in `create'

1 个答案:

答案 0 :(得分:2)

好。

  

我的CommentsController#Create

的ActiveModel :: ForbiddenAttributesError

这基本上意味着您不允许create方法中的必需属性。

这就是你需要的:

#app/controllers/comments_controller.rb
class CommentsController < ApplicationController
   def create
      @comment = @community.comments.new comment_params
      @comment.save
   end

   private

   def comment_params
      params.require(:comment).permit(:text).merge(user_id: current_user.id)
   end
end

您应该阅读strong params以更好地了解其工作原理。

<强>多晶型

您还有另一个问题可以通过polymorphic association来解决:

enter image description here

简单地说,这允许您将模型与任意数量的模型相关联。

在您的实例中,您可以对userscommunities发表评论,此功能将很好用:

#app/models/comment.rb
class Comment < ActiveRecord::Base
   belongs_to :user
   belongs_to :commentable, polymorphic: true
end

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :sent_comments, class_name: "Comment", foreign_key: :user_id
   has_many :comments, as: :commentable
end

#app/models/community.rb
class Community < ActiveRecord::Base
   has_many :comments, as: :commentable
end

这将允许您执行以下操作:

@user = User.find params[:id]
@user.comments.new comment_params

def comment_params
    params.require(:comment).permit(:text).merge(user_id: current_user.id) #-> current_user from Devise
end

这允许您将@user.comments@community.comments与一个关联一起使用。

您必须迁移commentable_id&amp; commentable_type列中的comments列,但在此之后上述代码应该有效。