【问题标题】:rails update method not calling class methodsrails update方法不调用类方法
【发布时间】:2013-10-31 07:00:49
【问题描述】:

我有一个类方法,我需要调用一个名为 auto_assign 的控制器更新方法!

本质上,它会找到请求数量最少的艺术家,并将该艺术家 ID 分配给对象。

它在 create 方法上完美运行,但在 update 方法上没有被调用,我不知道为什么。

控制器

  def update
    @virtual_request = VirtualRequest.find(params[:id])
    @virtual_request.auto_assign! # this never gets called

    if @virtual_request.update_attributes(virtual_params)
      flash[:success] = "Virtual request updated"
      redirect_to virtual_request_path(@virtual_request)
    else
      render 'edit'
    end
  end

  def create
    @virtual_request = VirtualRequest.new(virtual_params)
    @virtual_request.auto_assign! # works fine here!

    if @virtual_request.save
      flash[:success] = "Virtual has been created and assigned to # {@virtual_request.artist.name}"
      redirect_to virtual_requests_path
    else
      render 'new'
    end
  end

类 VirtualRequest

def auto_assign!
  if self.artist_id == 0
    artists = Artist.in_queue?.collect {|p| [ p.id, p.virtual_requests.count ] } 
    self.artist_id = artists.sort { |a,b| a[1] <=> b[1] }.first[0]
  end
end

HTML 发送参数

<select id="virtual_request_artist_id" name="virtual_request[artist_id]">
    <option selected="selected" value="0">auto-assign</option>
    <option value="2">Artist 1</option>
    <option value="5">Artist 2</option>
</select>

它应该在参数中的值为0时自动分配

更新:已解决

控制器

def update
  @virtual_request = VirtualRequest.find(params[:id])

  if @virtual_request.update_attributes(virtual_params)
    @virtual_request.auto_assign!
    flash[:success] = "Virtual request updated"
    redirect_to virtual_request_path(@virtual_request)
  else
    render 'edit'
  end
end

def auto_assign!
  if self.artist_id == 0
    artists = Artist.in_queue?.collect {|p| [ p.id, p.virtual_requests.count ] } 
    self.artist_id = artists.sort { |a,b| a[1] <=> b[1] }.first[0]
    self.save
  end
end

【问题讨论】:

  • 如果 'VirtualRequest.find(params[:id])' 没有失败,你的 auto_assign 方法必须被调用!可以发一下方法吗?
  • 到底发生了什么?您是否从更新操作中收到 Flash 消息?
  • 是的,我得到了 flash 方法,它最终将 0 的艺术家 ID 应用于实例,而不是像它应该分配的那样分配一个
  • 如果删除此行会发生什么:@virtual_request.auto_assign! 形成更新操作?其他一切都按预期工作吗?
  • 是的,一切正常,除了应用正确的artist_id,无论有没有@virtual_request.auto_assign!

标签: ruby-on-rails controller


【解决方案1】:

有几处是错误的:

首先,您需要在条件中调用@virtual_request.auto_assign!,否则不会设置artist_id。

其次,当您在 auto_assign 方法中进行更改时,请不要忘记 save 更新的实例:

def update
  @virtual_request = VirtualRequest.find(params[:id])

  if @virtual_request.update(virtual_params)
    @virtual_request.auto_assign!
    @virtual_request.save
    flash[:success] = "Virtual request updated"
    redirect_to virtual_request_path(@virtual_request)
  else
    render 'edit'
  end
end

这些方面的东西,但我相信其他人会提出更有效的解决方案

您的方法也可以选择(使用这种方法,您的控制器中不需要save)。

def auto_assign!
  if self.artist_id == 0
    artists = Artist.in_queue?.collect {|p| [ p.id, p.virtual_requests.count ] } 
    artist_id = artists.sort { |a,b| a[1] <=> b[1] }.first[0]
    self.update_attribute(:artist_id,artist_id)
  end
end

还有一些东西可以玩!

【讨论】:

  • 嘿,仅供参考,我刚刚尝试使用更新,但它不起作用,无论如何我都必须将 .save 放在类方法中。再次感谢您的所有帮助
  • 很抱歉在告诉你之后错过了哈哈 - 这不是最有效的方法 - 诚然,这有点匆忙,但我已经没时间了 - 但它已经解决了不过你的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多