我正在使用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)" to" def MyObject_params。"
答案 0 :(得分:6)
正如Brad Werth所说,你试图将params传递给你的MyObject_params方法。由于您已在控制器中将此方法标记为私有,因此它将拒绝接受显式接收器!私有vs公共与受保护的ruby方法有大量信息,但长期缺少的是你不能直接在对象上调用任何私有方法(例如@user.make_admin
)。这可以保护您免受外部来源的影响,试图操纵某些方法的使用。
将@myobject = MyObject.new(MyObject_params(:params))
更改为
@myobject = MyObject.new(MyObject_params)
是你想要的。我还建议遵循Ruby最佳实践并将MyObject_params方法下放到my_object_params
答案 1 :(得分:5)
您的错误消息告诉您正在尝试在符号上调用私有方法。执行此操作时:@myobject = MyObject.new(MyObject_params(:params))
,您将符号:params
传递给方法。看起来你真的想要params散列,它是@myobject = MyObject.new(MyObject_params(params))
(不是符号)。
由于两种方法具有相同的范围,您可以考虑不将params作为参数传递,而只是在MyObject_params
方法中引用它,就像在create
中一样方法。还可以考虑将MyObject_params
调整为至少my_object_params
,以适应Ruby约定,如果不是更具描述性的话。
答案 2 :(得分:4)
由于其他答案是正确的。我留下了我认为必须工作的代码。
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
中删除参数的调用和定义(我也改变为Ruby中的snake_case)。
由于time_in_ms
是从hour
,minute
和second
转换而来的,因此您必须在调用后使用参数。
重新排序后myobject_param
的回复将是哈希。
这应该删除您报告的2个错误。