2014-12-27 69 views
0

我试图附加user_id(以便我可以访问用户详细信息)到已经附加到名为Park的页面的评论。使用另一个表中的ID创建一个新的表格条目

我有三个表建立起来:公园,评论和用户:

class Park < ActiveRecord::Base 

    has_many :comments 
    has_many :users 

end 

class Comment < ActiveRecord::Base 

    belongs_to :park 
    has_one :user 

end 

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :comments 

    validates_presence_of :username 
    validates :username, uniqueness: true 

    def admin? 
    admin 
    end 
end 

正如你可以在上面看到,我使用了宝石设计为用户和授权。

评论显示在公园,所以他们是嵌套:

park_comment GET /parks/:park_id/comments/:id(.:format)  comments#show 

我的评论控制器设置这样的:

class CommentsController < ApplicationController 
    before_action :authenticate_user!, only: [:create] 
    before_action :authorize_admin!, only: [:delete] 

    def create 
     @park = Park.find(params[:park_id]) 
     @comment = @park.comments.create(comment_params) 
     redirect_to park_path(@park) 

    end 

    def destroy 
     @park = Park.find(params[:park_id]) 
     @comment = @park.comments.find(params[:id]) 
     @comment.destroy 

     redirect_to park_path(@park) 
    end 

    private 
    def comment_params 
     params.require(:comment).permit(:comment, :user_id, :park_id) 
    end 
end 

我已经能够从park_id振荡至user_id说明,但换句话说,这个交易一直在接受大量的零头。

我只是试图隐藏字段添加到我的评论形式

<%= form_for([@park, @park.comments.build]) do |f| %> 
<p> 
<%= f.label :comment %><br> 
<%= f.text_area :comment %> 
<%= hidden_field_tag(:user_id, current_user.id) %> 
</p> 
<p> 
     <%= f.submit %> 
</p> 
<% end %> 

但是,这似乎并没有产生任何结果。

我曾尝试过一些ActiveRecord加入工作,但它不想锁定到我的创建,所以我给了它。现在花了一段时间,我相信有一个简单的解决方案,我只是没有看到。想法?

回答

0

hidden_field_tag不工作。它会创建一个单独的参数,而不是嵌套在所需的参数关键字下。

我的建议是完全删除hidden_​​field并指定控制器中的current_user。

class CommentsController < ApplicationController 

    def create 
    @park = Park.find(params[:park_id]) 
    @comment = @park. 
       comments. 
       create(
        comment_params. 
        merge(user_id: current_user.id) # adding here, on creation 
        # or merge(user: current_user) 
       ) 
    redirect_to park_path(@park) 
    end 

    def comment_params 
    params. 
    require(:comment). 
    permit(:comment) 
    end 

end 

为什么?否则,用户可能会更改该hidden_​​field的值,并且您将错误地存储该评论的user_id值。

+0

这很好,谢谢! – mendokusai 2014-12-27 22:45:46

+0

如果这是值得的,那么投我的答案/将其标记为选中。 – Humza 2014-12-27 22:47:00

+0

完成,谢谢@Humza – mendokusai 2014-12-29 06:40:27

0

我不确定我是否正确理解了你,但看着你的代码,我可以看到一些问题。

首先,您创建一个隐藏字段,但不使用表单助手。这就是为什么你的user_id是不可见的你comment_params,造成您的

大胖子为零

:)。 尝试改变

<%= hidden_field_tag(:user_id, current_user.id) %> 

<%= f.hidden_field(:user_id, :value => current_user.id) %> 

但对于这一个更好的主意是只删除隐藏字段,并改变你的控制器

def create 
    @park = Park.find(params[:park_id]) 
    @comment = @park.comments.new(comment_params) 
    @comment.user = current_user 
    if @comment.save 
     redirect_to park_path(@park) 
    else 
     ... 
    end 
    end 

您现在可以删除您:user_id从您的comment_params这样的:

params.require(:comment).permit(:comment, :park_id) 

事实上,你甚至不需要:park_id在那里

相关问题