尝试保存我的对象时得到 "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

更改摘要:

  1. 从方法 myobject_params 的调用和定义中删除参数(我也更改为 snake_case,因为它在 Ruby 中是预期的)。

  2. 由于 time_in_ms 是从 hourminutesecond 转换而来的,您必须在调用参数后允许使用它们。

  3. 来自myobject_param的return,重新排序后将是一个hash。

这应该会消除您报告的 2 个错误。