尝试保存我的对象时得到 "private method `require' called for :params:Symbol"
Getting "private method `require' called for :params:Symbol" when trying to save my object
我正在使用 Rails 4.2.3。我的控制器里有这个……
def create
@myobject = MyObject.new(MyObject_params(:params))
@current_user = User.find(session["user_id"])
@myobject.user = @current_user
if @myobject.save
respond_to do |format|
format.html { redirect_to controller: "users", action: "index", notice: 'Saved successfully.' }
end
else
format.html { render action: "index" }
end
end
private
def MyObject_params(params)
# Main Code goes here
params.require(:myobject).permit(:time_in_ms, :name)
params[:myobject][:time_in_ms] = (params[:myobject][:hour].to_i * 60 * 60 + params[:myobject][:minute].to_i * 60 + params[:myobject][:second].to_i) * 1000
end
但是当我提交表单时,出现错误
private method `require' called for :params:Symbol
在这一行,“params.require(:myobject).permit(:time_in_ms, :name, :distance, :distance_units)”。不确定我遗漏了什么(或者我不小心包含了)。感谢您的帮助,- 戴夫
编辑:
在尝试给出的建议后,我得到了错误
When assigning attributes, you must pass a hash as an argument.
上线
@myobject = MyObject.new(MyObject_params)
除了在建议中进行调整外,我还更改了方法签名,"def MyObject_params(params)" 为 "def MyObject_params."
正如 Brad Werth 所说,您正在尝试将 :params 传递到您的 MyObject_params 方法中。由于您已在控制器中将此方法标记为私有,因此它将拒绝接受显式接收者!关于 private vs public vs protected ruby 方法有很多信息,但总的来说,你不能直接在对象上调用任何私有方法(例如 @user.make_admin
) .这可以保护您免受试图操纵某些方法的使用的外部来源的影响。
正在将 @myobject = MyObject.new(MyObject_params(:params))
更改为
@myobject = MyObject.new(MyObject_params)
就是你想要的。我还建议遵循 Ruby 最佳实践并将您的 MyObject_params 方法缩小为 my_object_params
您收到的错误消息告诉您您正在尝试调用一个符号的私有方法。当您这样做时:@myobject = MyObject.new(MyObject_params(:params))
,您将符号 :params
传递给该方法。看起来您真的想要 params 散列,它是 @myobject = MyObject.new(MyObject_params(params))
(不是符号)。
由于两种方法具有相同的作用域,您可以考虑完全不将参数作为参数传递,而只是在 MyObject_params
方法中引用它,就像在 [=14] 中一样=] 方法。还可以考虑将 MyObject_params
调整为至少 my_object_params
,以适应 Ruby 约定,如果不是更具描述性的话。
因为其他人的答案是正确的。我把我认为必须有效的代码留给你。
def create
@myobject = MyObject.new(myobject_params)
@current_user = User.find(session["user_id"])
@myobject.user = @current_user
if @myobject.save
respond_to do |format|
format.html { redirect_to controller: "users", action: "index", notice: 'Saved successfully.' }
end
else
format.html { render action: "index" }
end
end
private
def myobject_params
# Main Code goes here
params[:myobject][:time_in_ms] = (params[:myobject][:hour].to_i * 60 * 60 + params[:myobject][:minute].to_i * 60 + params[:myobject][:second].to_i) * 1000
params.require(:myobject).permit(:time_in_ms, :name)
end
更改摘要:
从方法 myobject_params
的调用和定义中删除参数(我也更改为 snake_case,因为它在 Ruby 中是预期的)。
由于 time_in_ms
是从 hour
、minute
和 second
转换而来的,您必须在调用参数后允许使用它们。
来自myobject_param
的return,重新排序后将是一个hash。
这应该会消除您报告的 2 个错误。
我正在使用 Rails 4.2.3。我的控制器里有这个……
def create
@myobject = MyObject.new(MyObject_params(:params))
@current_user = User.find(session["user_id"])
@myobject.user = @current_user
if @myobject.save
respond_to do |format|
format.html { redirect_to controller: "users", action: "index", notice: 'Saved successfully.' }
end
else
format.html { render action: "index" }
end
end
private
def MyObject_params(params)
# Main Code goes here
params.require(:myobject).permit(:time_in_ms, :name)
params[:myobject][:time_in_ms] = (params[:myobject][:hour].to_i * 60 * 60 + params[:myobject][:minute].to_i * 60 + params[:myobject][:second].to_i) * 1000
end
但是当我提交表单时,出现错误
private method `require' called for :params:Symbol
在这一行,“params.require(:myobject).permit(:time_in_ms, :name, :distance, :distance_units)”。不确定我遗漏了什么(或者我不小心包含了)。感谢您的帮助,- 戴夫
编辑:
在尝试给出的建议后,我得到了错误
When assigning attributes, you must pass a hash as an argument.
上线
@myobject = MyObject.new(MyObject_params)
除了在建议中进行调整外,我还更改了方法签名,"def MyObject_params(params)" 为 "def MyObject_params."
正如 Brad Werth 所说,您正在尝试将 :params 传递到您的 MyObject_params 方法中。由于您已在控制器中将此方法标记为私有,因此它将拒绝接受显式接收者!关于 private vs public vs protected ruby 方法有很多信息,但总的来说,你不能直接在对象上调用任何私有方法(例如 @user.make_admin
) .这可以保护您免受试图操纵某些方法的使用的外部来源的影响。
正在将 @myobject = MyObject.new(MyObject_params(:params))
更改为
@myobject = MyObject.new(MyObject_params)
就是你想要的。我还建议遵循 Ruby 最佳实践并将您的 MyObject_params 方法缩小为 my_object_params
您收到的错误消息告诉您您正在尝试调用一个符号的私有方法。当您这样做时:@myobject = MyObject.new(MyObject_params(:params))
,您将符号 :params
传递给该方法。看起来您真的想要 params 散列,它是 @myobject = MyObject.new(MyObject_params(params))
(不是符号)。
由于两种方法具有相同的作用域,您可以考虑完全不将参数作为参数传递,而只是在 MyObject_params
方法中引用它,就像在 [=14] 中一样=] 方法。还可以考虑将 MyObject_params
调整为至少 my_object_params
,以适应 Ruby 约定,如果不是更具描述性的话。
因为其他人的答案是正确的。我把我认为必须有效的代码留给你。
def create
@myobject = MyObject.new(myobject_params)
@current_user = User.find(session["user_id"])
@myobject.user = @current_user
if @myobject.save
respond_to do |format|
format.html { redirect_to controller: "users", action: "index", notice: 'Saved successfully.' }
end
else
format.html { render action: "index" }
end
end
private
def myobject_params
# Main Code goes here
params[:myobject][:time_in_ms] = (params[:myobject][:hour].to_i * 60 * 60 + params[:myobject][:minute].to_i * 60 + params[:myobject][:second].to_i) * 1000
params.require(:myobject).permit(:time_in_ms, :name)
end
更改摘要:
从方法
myobject_params
的调用和定义中删除参数(我也更改为 snake_case,因为它在 Ruby 中是预期的)。由于
time_in_ms
是从hour
、minute
和second
转换而来的,您必须在调用参数后允许使用它们。来自
myobject_param
的return,重新排序后将是一个hash。
这应该会消除您报告的 2 个错误。