Rails 3创建了Rails4强参数

时间:2017-02-09 09:20:39

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 strong-parameters

我正在将我的Rails 3项目转换为Rails4,但我对DECLARE @DATE NVARCHAR(20) = '2017/01/15' IF (CAST(getdate() AS DATE) > CAST(@DATE AS DATE)) PRINT 'Selected date is in past' ELSE IF (CAST(getdate() AS DATE) = CAST(@DATE AS DATE)) PRINT 'Selected date is today' ELSE PRINT 'Selected date is in future' 感到困惑。

以下是strong parameter

中的原始代码
Rails 3

工作正常。但是在我series_mission = SeriesMission.create({name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time, end_time: end_time, gamecharacter_id: gc.id}, :without_protection => true) 修改成这种方式后,它出了问题。

Rails 4

它抛出了这个错误

attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
     end_time: end_time, gamecharacter_id: gc.id }
attrs = attrs.require(:series_mission).permit(:name, :mode, :start_time, :end_time, :gamecharacter_id)
series_mission = SeriesMission.create(attrs)

更新

private method `require' called for #<Hash:0x007fd2a421e8b8>

qset_ids = params[:sub_missions] start_time = ((t = params[:start_time].to_i) == 0 ? nil : Time.at(t)) end_time = ((t = params[:end_time].to_i) == 0 ? nil : Time.at(t))

未通过gamecharacter_id

2 个答案:

答案 0 :(得分:0)

你误解了强参数的目的。它们用于白名单传入数据。但是既然你已经这样做(通过构建那个哈希),你就不需要强大的参数。

attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
     end_time: end_time, gamecharacter_id: gc.id }
series_mission = SeriesMission.create(attrs)

你是什么意思,白名单?

想象一下,您有一个个人资料编辑页面。在那里你可以改变名称和图片。您应用中的某些用户可以是管理员。此状态由db中的布尔列is_admin控制。当然,您无法通过该配置文件编辑UI使用户成为管理员,因为它没有复选框。但是,恶意用户可以伪造他们喜欢的请求并发送数据,就好像那样这样的复选框。而你会盲目地接受它并让他们成为管理员。

使用强大的参数,您白名单要处理的数据

params.require(:user).permit(:name, :picture)

在这里,即使请求中存在is_admin param,它也会被丢弃而不会在更新操作中使用。

正如您所看到的,您的问题中的代码不会受此影响,因为存在“自然”白名单。

答案 1 :(得分:0)

强对数仅用于质量分配。看到您手动传递每个单独的属性,您根本不需要使用强参数。这将有效:

attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
 end_time: end_time, gamecharacter_id: gc.id }

series_mission = SeriesMission.create(attrs)