更改rails控制器中的参数

时间:2014-10-09 18:03:23

标签: ruby-on-rails

我有一个带有以下方法的控制器

 def create
    @todo = Event.new(event_params)
    ...
 end

 def event_params
   form_params = [:title, :type, :owner_id, :note, :occurred, :due]
   form_params[:due].strftime!("%Y-%m-%d")
   params.permit(form_params)
 end

我发现当我使用mm / dd / yyyy而不是dd / mm / yyyy的格式向create方法发布日期(:due或:)时,我的参数超出了范围日期,例如10/30/2014。所以我试图在调用Event.new

之前转换参数中的日期值

line - form_params [:due] .strftime!("%Y-%m-%d") - 无法正常工作,经过相当多的谷歌搜索,我似乎无法找出修改参数值的正确方法。我目前为该行获得的错误是"没有将Symbol隐式转换为整数"。我怎样才能做到这一点?感谢。

3 个答案:

答案 0 :(得分:1)

您正在为form_params分配一个符号数组,并且您不能通过符号引用数组元素,因此您的错误。您可能希望它看起来像这样:

form_params = params.permit(:title, :type, :owner_id, :note, :occurred, :due)

将为您提供所需的哈希值。

编辑:起初我没有检查你正在尝试的日期操作。您需要使用Date.strptime将字符串转换为日期,但您需要知道日期格式。不幸的是,你无法准确猜出那种类型的东西。如果你知道日期是mm / dd / yyyy,你可以转换这样的格式:

params[:due] = Date.strptime(params[:due], '%m/%d/%Y').strftime("%Y-%m-%d")

答案 1 :(得分:1)

好吧,让我们讨论你的代码的每一行,以明确错误的位置。

form_params = [:title, :type, :owner_id, :note, :occurred, :due]

首先,声明一个符号数组并将该数组赋值给form_params变量。它只是一个简单的普通数组,而不是关联数组,因此您只能使用索引访问其值,例如form_params[0]将返回:title,但form_params[:due]是运行时错误,因为:due不是整数索引。 实际上,event_params方法的目的应该简单说明允许将哪些参数分配给对象,因此看起来应该是

params.permit([:title, :type, :owner_id, :note, :occurred, :due])

更进一步,您的目标是编辑来自客户端的参数。截至各种日期格式解析,请参阅this topic


免责声明:强制用户以传统的due格式传递%Y-%m-%d日期会更加优雅。请查看rails dates helper方法。


该参数驻留在params哈希中,因此您可以重写相应的密钥:

def event_params
  params["due"] = Date.strptime(params["due"], "%m/%d/%Y").to_s
  # here we've converted date format to standard %Y-%m-%d
  params.permit([:title, :type, :owner_id, :note, :occurred, :due])
end

这应该做两件事:

  1. 用适当的日期格式替换用户due
  2. 允许为对象批量指定枚举键
  3. 其余的代码应该可以正常进行此更正:

    def create
      @todo = Event.new(event_params)
      ...
    

    但是,要注意副作用:

    1. 使用event_params限制您现在无法获得实际的%m/%d/%Y用户输入。
    2. Malefactor将能够传递一些不可解析的字符串而不是%m/%d/%Y格式化的日期,并且它将以运行时错误结束。

答案 2 :(得分:0)

超级游戏,但你可以考虑使用这个宝石:github.com/launchpadlab/decanter

它允许您轻松定义如何解析传入的参数。

更多相关信息:https://medium.com/launchpad-lab/the-missing-step-in-rails-controllers-82aaa9172165