Rails Param人口

时间:2013-12-18 17:13:08

标签: ruby-on-rails ruby-on-rails-4 mongoid

当您拥有rails资源时,rails似乎会自动为该资源创建一个params条目属性。例如如果我的模型课程有一个主题属性,我发表主题=数学,它会自动创建参数[lesson] = {subject:'Hello'}。我遇到的问题是让嵌套属性出现在这个创建的课程数组中。

我正在使用mongoid作为我的后端,并在Lesson上称为活动关联。代码如下所示:

class Lesson
  include Mongoid::Document

  field :subject, type: String

  embeds_many :activities, class_name: 'LessonActivity' do
    def ordered
      @target.sort { |x, y| x.display_order <=> y.display_order }
    end

    def reorder!
      @target.each_with_index { |val, index| val.display_order = index }
    end
  end

  accepts_nested_attributes_for :activities

但是,我无法弄清楚如何从params.require(:lesson).permit :activities内访问此活动 我可以通过params.permit(:activities)访问它,但感觉有点混乱

3 个答案:

答案 0 :(得分:2)

我已经做了一些挖掘,并发现了这是怎么回事。

这一切都来自导轨功能,Param包装,detailsapi。为json配置的将自动将模型的属性传递给模型名称的参数(在本例中为Lesson)。

将根据模型如何响应方法attribute_names来填充模型的属性,因此这提供了两条路径来实现问题的目标。

1 - 指示我的控制器将活动作为课程参数的一部分包括在内,例如使用这种方法:

class Api::LessonsController < Api::ApiController
  wrap_parameters Lesson, include: Lesson.attribute_names << :activities

2 - 更新模型的attiribute_names方法以包括:活动

我还有几件事要解决,即关联的原因不是Mongoid上的attribute_names的一部分,如果重写它以包含属性名称是个坏主意。

答案 1 :(得分:0)

根据您为JSON POST请求提供的参数,您需要使用以下代码将所需的参数列入白名单:

def activities_params
  params.require(:activities).permit(:title, :display_order, :content, :time)
end

您的JSON POST请求转发的params没有:activities hash作为:lesson键的值,因此将您需要的参数列入白名单就像上面一样简单。

答案 2 :(得分:0)

我想你可能在这里回答了你的问题:

“我怎样才能把它作为课程的一部分,或者为什么我不能。我没有通过课程参数”

如果我读得正确,你没有传递课程参数,只是活动的散列?

这可以解释为什么你可以访问
  params.permit(:活动) 但不是   params.require(:lesson).permit:activities