ActiveModel::ForbiddenAttributesError 创建对论坛的回复时 post
ActiveModel::ForbiddenAttributesError when creating a reply to a forum post
我正在使用 rails 5.0.0。当我尝试创建对论坛 post 的回复时出现以下错误。
Started POST "/discussions/7/replies" for 108.252.220.249 at 2018-03-19 15:54:44 +0000
Cannot render console from 108.252.220.249! Allowed networks: 127.0.0.1,::1, 127.0.0.0/127.255.255.255
Processing by RepliesController#create as JS
Parameters: {"utf8"=>"✓", "reply"=>{"reply"=>""}, "commit"=>"Submit Reply", "discussion_id"=>"7"}
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
Discussion Load (0.2ms) SELECT "discussions".* FROM "discussions" WHERE "discussions"."id" = ? LIMIT ? [["id", 7], ["LIMIT", 1]]
(0.1ms) begin transaction
(0.1ms) rollback transaction
Completed 401 Unauthorized in 10ms (ActiveRecord: 1.0ms)
ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
这是我的回复控制器文件的一部分。该错误使创建操作看起来有问题,所以这就是我为此 post 包含的内容。另外,在我的模式中,有一个 'replies' table 和一个名为 'reply' 的列,这是用户想要提交作为响应的实际文本。很抱歉混淆了命名方案。
我感觉create动作是对的,就是其他地方不对。像强参数类型的问题?关于我的文件中的其他哪些地方可能会导致出现此类错误,是否有任何建议?
class RepliesController < ApplicationController
before_action :authenticate_user!
before_action :set_reply, only: [:edit, :update, :show, :destroy]
before_action :set_discussion, only: [:create, :edit, :show, :update, :destroy]
def create
#create a reply within the discussion and save userid to the reply
@reply = @discussion.replies.create(params[:reply]).permit(:reply, :discussion_id)
@reply.user_id = current_user.id
respond_to do |format|
if @reply.save
format.html {redirect_to discussion_path(@discussion)}
format.js #render create.js.erb
else
format.html{redirect_to discussion_path(@discussion), notice: 'Reply did not save. Try again'}
format.js
end
end
end
...
private
def set_discussion
@discussion = Discussion.find(params[:discussion_id])
end
def set_reply
@reply = Reply.find(params[:id])
end
def reply_params
params.require(:reply).permit(:reply)
end
结束
问题出在这一行:
@reply = @discussion.replies.create(params[:reply]).permit(:reply, :discussion_id)
你应该使用类似的东西:
@reply = @discussion.replies.create(reply_params)
我建议您更新表格以包含 discussion_id
,并将其添加到 reply_params
。这样您就可以使用上面建议的行创建记录。
为此,您需要在表单中添加类似于以下内容的一行:
<%= f.hidden_field :discussion_id, @discussion.id %>
但是,值得考虑的是,如果用户有恶意,他们仍然可以在页面上编辑它。因此,如果固定讨论对安全性至关重要,您可以处理分配服务器端(正如您目前正在做的那样 - 请参阅下面的更新)。
希望对您有所帮助 - 如果您有任何问题,请告诉我您的进展情况。
更新
当您使用 @discussion.replies.create...
时,将自动分配 discussion_id
。这意味着以下应该可以正常工作:
@reply = @discussion.replies.create(reply_params)
强参数用于防止批量分配引起的问题,因此您实际上只在此处分配一个属性,您可以进一步简化它:
@reply = @discussion.replies.create(params[:reply][:reply])
但是,我推荐第一个选项,因为您可以随着项目的扩展向 reply_params
添加新列。
希望对您有所帮助!
我正在使用 rails 5.0.0。当我尝试创建对论坛 post 的回复时出现以下错误。
Started POST "/discussions/7/replies" for 108.252.220.249 at 2018-03-19 15:54:44 +0000
Cannot render console from 108.252.220.249! Allowed networks: 127.0.0.1,::1, 127.0.0.0/127.255.255.255
Processing by RepliesController#create as JS
Parameters: {"utf8"=>"✓", "reply"=>{"reply"=>""}, "commit"=>"Submit Reply", "discussion_id"=>"7"}
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
Discussion Load (0.2ms) SELECT "discussions".* FROM "discussions" WHERE "discussions"."id" = ? LIMIT ? [["id", 7], ["LIMIT", 1]]
(0.1ms) begin transaction
(0.1ms) rollback transaction
Completed 401 Unauthorized in 10ms (ActiveRecord: 1.0ms)
ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
这是我的回复控制器文件的一部分。该错误使创建操作看起来有问题,所以这就是我为此 post 包含的内容。另外,在我的模式中,有一个 'replies' table 和一个名为 'reply' 的列,这是用户想要提交作为响应的实际文本。很抱歉混淆了命名方案。
我感觉create动作是对的,就是其他地方不对。像强参数类型的问题?关于我的文件中的其他哪些地方可能会导致出现此类错误,是否有任何建议?
class RepliesController < ApplicationController
before_action :authenticate_user!
before_action :set_reply, only: [:edit, :update, :show, :destroy]
before_action :set_discussion, only: [:create, :edit, :show, :update, :destroy]
def create
#create a reply within the discussion and save userid to the reply
@reply = @discussion.replies.create(params[:reply]).permit(:reply, :discussion_id)
@reply.user_id = current_user.id
respond_to do |format|
if @reply.save
format.html {redirect_to discussion_path(@discussion)}
format.js #render create.js.erb
else
format.html{redirect_to discussion_path(@discussion), notice: 'Reply did not save. Try again'}
format.js
end
end
end
...
private
def set_discussion
@discussion = Discussion.find(params[:discussion_id])
end
def set_reply
@reply = Reply.find(params[:id])
end
def reply_params
params.require(:reply).permit(:reply)
end
结束
问题出在这一行:
@reply = @discussion.replies.create(params[:reply]).permit(:reply, :discussion_id)
你应该使用类似的东西:
@reply = @discussion.replies.create(reply_params)
我建议您更新表格以包含 discussion_id
,并将其添加到 reply_params
。这样您就可以使用上面建议的行创建记录。
为此,您需要在表单中添加类似于以下内容的一行:
<%= f.hidden_field :discussion_id, @discussion.id %>
但是,值得考虑的是,如果用户有恶意,他们仍然可以在页面上编辑它。因此,如果固定讨论对安全性至关重要,您可以处理分配服务器端(正如您目前正在做的那样 - 请参阅下面的更新)。
希望对您有所帮助 - 如果您有任何问题,请告诉我您的进展情况。
更新
当您使用 @discussion.replies.create...
时,将自动分配 discussion_id
。这意味着以下应该可以正常工作:
@reply = @discussion.replies.create(reply_params)
强参数用于防止批量分配引起的问题,因此您实际上只在此处分配一个属性,您可以进一步简化它:
@reply = @discussion.replies.create(params[:reply][:reply])
但是,我推荐第一个选项,因为您可以随着项目的扩展向 reply_params
添加新列。
希望对您有所帮助!