在尝试保存我的对象时,获取"私有方法`require'要求:params:Symbol"

Dav*_*ave 5 methods ruby-on-rails params ruby-on-rails-4

我正在使用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
Run Code Online (Sandbox Code Playgroud)

但是当我提交表单时,我收到错误

private method `require' called for :params:Symbol
Run Code Online (Sandbox Code Playgroud)

在这一行,"params.require(:myobject).permit(:time_in_ms,:name,:distance,:distance_units)".不知道我错过了什么(或者我不小心包括在内).谢谢你的帮助, - 戴夫

编辑:

在尝试给出建议后,我得到了错误

When assigning attributes, you must pass a hash as an argument.
Run Code Online (Sandbox Code Playgroud)

在线上

@myobject = MyObject.new(MyObject_params)
Run Code Online (Sandbox Code Playgroud)

除了在建议中进行调整之外,我还将方法签名"def MyObject_params(params)"更改为"def MyObject_params".

bku*_*i01 6

正如Brad Werth所说,你试图将params传递给你的MyObject_params方法.由于您已在控制器中将此方法标记为私有,因此它将拒绝接受显式接收器!私有vs公共与受保护的ruby方法有大量信息,但长期缺少的是你不能直接在对象上调用任何私有方法(例如@user.make_admin).这可以保护您免受外部来源的影响,这些来源试图操纵某些方法的使用.

更改@myobject = MyObject.new(MyObject_params(:params))

 @myobject = MyObject.new(MyObject_params) 
Run Code Online (Sandbox Code Playgroud)

是你想要的.我还建议遵循Ruby最佳实践并将MyObject_params方法下放到my_object_params


Bra*_*rth 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约定,如果不是更具描述性的东西.


Ale*_*bio 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
Run Code Online (Sandbox Code Playgroud)

变更摘要:

  1. 从调用和定义的方法中删除参数myobject_params(我也将其更改为 Snake_case,正如 Ruby 中所期望的那样)。

  2. 由于time_in_ms是从 , 转换而来hourminute并且second您必须在调用参数后允许使用这些参数。

  3. 重新排序后,从 的返回myobject_param将是一个哈希值。

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