我有一个带有以下方法的控制器
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隐式转换为整数"。我怎样才能做到这一点?感谢。
答案 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
这应该做两件事:
due
其余的代码应该可以正常进行此更正:
def create
@todo = Event.new(event_params)
...
但是,要注意副作用:
event_params
限制您现在无法获得实际的%m/%d/%Y
用户输入。%m/%d/%Y
格式化的日期,并且它将以运行时错误结束。 答案 2 :(得分:0)
超级游戏,但你可以考虑使用这个宝石:github.com/launchpadlab/decanter
它允许您轻松定义如何解析传入的参数。
更多相关信息:https://medium.com/launchpad-lab/the-missing-step-in-rails-controllers-82aaa9172165