我有一个RESTful API(ActionController :: API)服务,它接受一个params列表。 RESTful服务接受JSON主体请求(使用Content-Type of application / json)。当我调试控制器/动作(在动作def之后)并在参数列表中取得峰值时,它显示如下:
{"given_name":"Mark"}
修改 所有请求都在其中(当它传递给控制器/动作时 - 使用POSTman):
user = User.new(params)
请注意,该对象包含两次given_name参数。这是正常的行为吗?我没有通过"用户"对象(json对象)到控制器/动作?什么是允许的旗帜?
当我尝试使用时(现在我只是测试RESTful调用并分配用户对象的任何值,除了......还没有编译验证):
#<ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError>
我收到错误:
var marker = L.marker([41.15789, -104.80812])
.bindPopup('Site: Cheyenne ASOS <br> <a href="http://w1.weather.gov/data/obhistory/KCYS.html">Current Observations</a>')
.addTo(map);
所以,我到处寻找这背后的原因(为什么在params列表中有一个&#34;用户&#34;键?允许标志的目的是什么?为什么我得到一个我尝试分配参数时出错?
修改
进行一些测试后,我从&#34; user_controller&#34;更改了控制器名称。到&#34; tester_controller&#34;并设置路由以指向重命名的控制器。
似乎&#34;用户&#34;上面的参数列表中的对象已更改为&#34; tester&#34;。那么为什么param列表包含一个&#34;对象&#34;所有传递的params与控制器的名称?如果是这样,为什么需要呢?
非常感谢任何帮助。
答案 0 :(得分:0)
您无法将params
传递给构造函数,因为params
始终包含:action
和:controller
个键。新对象的属性应放在用于标识要创建的模型的密钥下的哈希值中,例如:user
。我建议您咨询rails guides,尤其是“表格助手”指南的chapter 7。
如果您想了解有关强参数的更多信息,还可以在导轨指南中找到chapter:)
答案 1 :(得分:0)
您需要指定控制器中质量分配可接受的属性。
role
这可以防止恶意用户发出更改应用程序内部属性的请求帖子,例如在用户对象的情况下<select title= "Fruit selected" name="fruit" id="fruit">
<option value="none selected">-Select Fruit-</option>
<?php if(!is_null($user)){ if($user['fruit']=="apple"){echo '<option value="apple" selected="selected">Apple</option>'}}else{echo '<option value="apple">Apple</option>'}?>
<?php if(!is_null($user)){ if($user['grad_semister']=="banana"){echo '<option value="banana" selected="selected">Banana</option>'}}else{echo '<option value="banana">Banana</option>'}?>
</select>
。
如上所述,可以在引用strong parameters的指南中找到更好的解释。
答案 2 :(得分:0)
默认情况下,API模式下的Rails将JSON请求参数包装到一个哈希中,从控制器类中猜测其名称。这就是为什么将控制器从“用户”更改为“测试器”会更改“对象”名称的原因。您可以阅读详细信息here。
因此,如果您在参数中不需要此“对象”,只需从:json
中的:format
数组中删除config\initializers\wrap_parameters.rb
。或者,您可以如上所述在控制器级别使用细粒度控制。