我想用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?" %>
感谢。
答案 0 :(得分: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 %>
答案 1 :(得分:0)
我以前从来没有这样,我没有得到逻辑,但你应该进行重构...调用一个动作,发送数据,并且该动作可以调用一个函数来执行你想要做的其他事情。此外,您应该使用别名,在路线中定义它。
答案 2 :(得分:0)
出现类似情况我需要用户在一个模型视图中按下按钮并在不同模型的控制器中创建一个新行,然后同时更改源模型中的布尔属性。我最终变薄了控制器,并在相应的模型中创建了一个新方法,并在操作中指向它。捎带@John的答案,这里对我有用,可能是你或任何需要在一个用户按下按钮时执行多个操作的人的替代策略,可能在多个模型之间:
FOO CONTROLLER / NEW
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