【问题标题】:Calling model custom method in controller在控制器中调用模型自定义方法
【发布时间】:2015-10-19 18:51:19
【问题描述】:

我试图在我的控制器中调用我在模型中创建的自定义方法,但是当我提交指向控制器操作的表单时,我收到以下错误:

#Rally:0x4c1fa90 的未定义方法 `add_manager'

def add_manager
    if @rally.add_manager(manager_params)
      format.html { redirect_to @rally, notice: 'Manager successfully added.' }
      format.json { head :no_content }
    else

这是我的代码中的内容

rally.rb

def self.add_manager(params)
    user = User.where(:email => params[:email])
    rally.users << user
end

rallies_controller.rb

  def add_manager
    if @rally.add_manager(manager_params)
      format.html { redirect_to @rally, notice: 'Manager successfully added.' }
      format.json { head :no_content }
    else
      format.html { render action: 'edit' }
      format.json { render json: @rally.errors, status: :unprocessable_entity }
    end
  end

到目前为止我所做的测试:

  • 检查@rally 是否设置:有效
  • 已检查列出的可用方法:add_manager 未列出
  • 在 Rails 控制台中测试了所有命令:有效

知道我做错了什么吗?

【问题讨论】:

  • 在方法定义中使用 self 使其成为类方法。因此,Rally.add_manager 会起作用,但我怀疑这是你想要的。
  • @SrdjanPejic 我明白了。奇怪的是它仍然可以在 Rails 控制台中工作,但不能在控制器中工作。那么最好的解决方案是将其作为私有方法移动到控制器中吗?
  • 不,只需从方法定义中删除 self 即可。另外,如果user 为零,您确定rally.users &lt;&lt; user 会失败吗?如果没有,您就是在进行不必要的检查。
  • @SrdjanPejic 成功了!谢谢您的帮助。至于支票,我还没有添加。只是想确保在添加其他位之前能够正确处理表单。

标签: ruby-on-rails ruby methods controller


【解决方案1】:

更改类方法:

def self.add_manager(params)

到一个实例方法:

def add_manager(params)

@rally 是你的 Rally 类的一个实例

(在上面的 cmets 中已回答 - 从未回答列表中删除)

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多