1

我想用 link_to 按钮调用 2 个不同的操作。当我放置以下代码时,按钮仅显示为蓝色链接,并且不会调用第二个操作。有人知道解决这个问题的策略吗?

<%= link_to "Remove from Cabinet", { :controller => 'devices', :action => 'detach_device_from_cabinet', :id => device.id }, 
            { :controller => 'cabinets', :action => 'unmark_validated', :id => @cabinet.id }, :class => "btn btn-danger", :confirm => "Detach Device: are you sure?" %>

谢谢。

4

3 回答 3

5

从单个 link_to 调用多个控制器操作不是一个好习惯。您在视图中添加了太多逻辑。

有一种称为“胖模型,瘦控制器”的导轨设计模式。您希望所有业务逻辑都在模型中完成,并且控制器只调用模型的方法。在这个具体的例子中,您想从一个机柜中分离设备,每个设备可以在一个机柜上,每个机柜可以容纳多个设备。

我没有检查过这段代码,但它应该接近你想要的:

cabinet.rb

class Cabinet < ActiveRecord::Base
  has_many :devices
  ...

  def self.detach_device(id)
    cabinet = Cabinet.where(device: id).first
    cabinet.devices.drop(id)
    cabinet.unmark_validated
  end

  def unmark_validated
     cabinet.marked == false
  end
end

device.rb

class Device < ActiveRecord::Base
  belongs_to :cabinet
  ...

end

cabinets_controller.rb

class CabinetsController < ApplicationController
  def detach_from_cabinet
    @cabinet = Cabinet.detach_device(params[id])

  end
end

<%= link_to "Remove from Cabinet", :controller => 'cabinets', :action => 'detach_device', id => device.id %>

于 2013-04-05T16:07:46.773 回答
0

我以前从来没有这样过,我不明白逻辑,但是你应该进行重构......调用一个动作,发送数据,那个动作可以调用一个函数来执行你想做的其他事情。此外,您应该使用别名,在路由中定义它。

于 2013-04-05T15:46:13.050 回答
0

有类似的情况,我需要用户在一个模型视图中按下按钮并在不同模型的控制器中创建一个新行,然后同时更改源模型中的布尔属性。我最终细化了我的控制器并在相应的模型中创建了一个新方法并在操作中指向它。捎带@John的回答,这对我有用,对于您或任何需要在一个用户按下按钮时执行多个操作的人来说,这可能是一种替代策略,并且可能在多个模型之间:

FOO 控制器/新

 def new
    ...
    # After button is pushed sending params to this action, thusly 
    # creating the new row, and saving it 
    @foo.save
    # Then to the newly created method
    @foo.new_method 
    # and back for a redirect
    redirect_to :foos, notice: "..."
  end

foo.rb

  def new_method
    @bar = Bar.find_by(:attribute => true)
    # Simply need to fllip attribute from true to false
    if @bar.attribute == true
      @bar.attribute = false
    end
    @bar.save
  end
于 2016-04-04T15:36:50.143 回答