当您拥有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)
访问它,但感觉有点混乱
答案 0 :(得分:2)
我已经做了一些挖掘,并发现了这是怎么回事。
这一切都来自导轨功能,Param包装,details和api。为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