Rails 5 Params / Strong Params问题

时间:2016-07-21 22:31:23

标签: ruby-on-rails ruby-on-rails-5

我有一个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与控制器的名称?如果是这样,为什么需要呢?

非常感谢任何帮助。

3 个答案:

答案 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。或者,您可以如上所述在控制器级别使用细粒度控制。