Ruby on 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

我有一个Rails控制器,我正在使用白名单参数创建新项目:

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使用…你确定吗?你怎么这么自信?你亲自去检查过吗?(也许你看过,但它总是值得一看,它对我来说绝对是“这不是正常、安全的轨道操作”)