Ruby on rails 名为'的Rails控制器参数;应用程序';散列
我有一个Rails控制器,我正在使用白名单参数创建新项目:Ruby on rails 名为'的Rails控制器参数;应用程序';散列,ruby-on-rails,ruby,heroku,controller,Ruby On Rails,Ruby,Heroku,Controller,我有一个Rails控制器,我正在使用白名单参数创建新项目: def course_discussion_comment_params params.require(:course_discussion_comment).permit! end 大多数情况下,这是正确的,并且日志显示参数散列如下 Parameters: {"body"=>"xxx", "course_id"=>"xxx", "course_discussion_id"=>"xxx", "course_dis
def course_discussion_comment_params
params.require(:course_discussion_comment).permit!
end
大多数情况下,这是正确的,并且日志显示参数散列如下
Parameters: {"body"=>"xxx", "course_id"=>"xxx", "course_discussion_id"=>"xxx", "course_discussion_comment"=>{"body"=>"xxx"}}
但是,Rails有时似乎无法正确解析params散列,请求失败,使用应用程序
而不是课程_讨论_注释
记录params散列,如下所示:
Parameters: {"body"=>"xxx", "course_id"=>"xxx", "course_discussion_id"=>"xxx", "application"=>{"body"=>"xxx"}}
...
ActionController::ParameterMissing (param is missing or the value is empty: course_discussion_comment):
在我这方面,我似乎找不到任何导致问题的原因,问题是间歇性的,并且也发生在其他控制器上,但这是一致的,因为它已经发生过多次,特别是这个控制器似乎受影响最严重,每隔几天发生一次,只有在服务器重新启动时才能得到解决(在Heroku上,所以dyno每天都会重新启动)
有什么想法吗?这是完整的控制器:
class CourseDiscussionCommentsController < ApplicationController
before_action :load_course
before_action :load_course_discussion
before_action :set_course_discussion_comment, only: [:update, :destroy]
before_action {
in_course(params[:course_id])
}
before_action only: [:update, :destroy] {
current_user(@course_discussion_comment[:from][:_id])
}
def create
course_discussion_comment_params[:from] = {
_id: @authenticatedUser[:id],
firstName: @authenticatedUser[:firstName],
lastName: @authenticatedUser[:lastName],
}
course_discussion_comment_params[:deleted] = false
@course_discussion_comment = @course_discussion.course_topic_comments.build(course_discussion_comment_params)
if @course_discussion_comment.save
DiscussionActionMailer.comment_added(request.base_url, @course, @authenticatedUser, @course_discussion, @course_discussion_comment).deliver_now
render json: @course_discussion_comment, status: 200
else
render json: @course_discussion_comment.errors, status: 422
end
end
def update
if @course_discussion_comment.update(course_discussion_comment_params)
render json: @course_discussion_comment, status: 200
else
render json: @course_discussion_comment.errors, status: 422
end
end
def destroy
params = {
:deleted => true
}
if @course_discussion_comment.update(params)
render json: @course_discussion_comment, status: 200
else
render json: @course_discussion_comment.errors, status: 422
end
end
private
def course_discussion_comment_params
params.require(:course_discussion_comment).permit!
end
def load_course
@course = Course.find(params[:course_id])
end
def load_course_discussion
@course_discussion = @course.course_topics.find(params[:course_discussion_id])
end
def set_course_discussion_comment
@course_discussion_comment = @course_discussion.course_topic_comments.find(params[:id])
end
end
class CourseDiscussionCommentsControllertrue
}
if@course\u discussion\u comment.update(参数)
呈现json:@course\u discussion\u comment,状态:200
其他的
呈现json:@course\u discussion\u comment.errors,状态:422
结束
结束
私有的
定义课程\讨论\评论\参数
参数要求(:课程\讨论\评论)。允许!
结束
def装载课程
@course=course.find(参数[:course\u id])
结束
def加载课程讨论
@课程讨论=@course.course\u topics.find(参数[:课程讨论\u id])
结束
def设置\课程\讨论\评论
@课程讨论注释=@课程讨论.课程主题注释.查找(参数[:id])
结束
结束
你能给我们看一下相关的视图吗?还有[:\u id]
这似乎很危险……为什么要创建名称中带有下划线的神奇变量……您是否考虑过,带有下划线的变量是为使用Rails的内部命名作用域而预留的……这可能就是这个bug的来源?我使用的是Mongoid而不是ActiveRecord。:\u id
不是神奇变量,它是由Mongoid生成的MongoDB OID。控制器直接将对象呈现为JSON,我这里不使用普通视图。错误发生在视图呈现之前。这不一定是真的……错误实际上发生在将应用程序
放入您提交的表单的位置创建操作…我认为它发生在新操作或新视图中…(在本例中),而不是抛出错误的创建操作。另外…\u id
很可能被Rails和mongoid使用…你确定吗?你怎么这么自信?你亲自去检查过吗?(也许你看过,但它总是值得一看,它对我来说绝对是“这不是正常、安全的轨道操作”)