获得"私人方法`需要'呼吁:params:符号"在尝试保存对象时

时间:2016-05-21 22:42:39

标签: ruby-on-rails ruby-on-rails-4 methods params

我正在使用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。"

3 个答案:

答案 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

变更摘要:

  1. 从方法myobject_params中删除参数的调用和定义(我也改变为Ruby中的snake_case)。

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

  3. 重新排序后myobject_param的回复将是哈希。

  4. 这应该删除您报告的2个错误。

相关问题