例如,如果我有一个模型protected function setUp()
{
$maiContratService = $this->getMockBuilder('Maintenance\Service\Model\FMaiContratService')
->disableOriginalConstructor()
->getMock();
$oContrat = new FMaiContrat($maiContratService);
$stub = $this->returnValue($oContrat);
$maiContratService->expects($this->any())->method('selectById')->will($stub);
Doctype::unsetDoctypeRegistry();
$this->helper = new SousMenuContrat();
$this->renderer = new PhpRenderer;
$this->viewHelperManager = $this->renderer->getHelperPluginManager();
$config = new HelperConfig();
$config->configureServiceManager($this->viewHelperManager);
$this->helper->setView($this->renderer);
parent::setUp();
}
,并且我为其定义了资源丰富的路线,我必须手动将Item
动作包含为成员,为什么会这样?
示例:
:delete
我需要# .../config/routes.rb
resources :items do
member { get :delete }
end
操作才能向用户显示确认对话框。有没有更好的方法来完成我想要做的事情?或者我做得对,这是最好的做法吗?
答案 0 :(得分:3)
通常,您使用不显眼的js显示确认对话框。像这样的东西
<%= link_to 'Destroy', item_path(@item), method: :delete, data: {confirm: 'Are you sure?'} %>
这将生成一段JS,将拦截点击链接并显示确认模式。如果您选择继续,则会发送表单。
是的,不要通过GET请求执行此类危险操作(除非您有正当理由)
答案 1 :(得分:3)
那是因为默认你应该显示客户端JS的确认对话框,如@SergioTulentsev所述。有一个单独的页面&#34;删除确认&#34; 只是不常见,因此不是默认值。
是的,您可能已经注意到某些操作中的模式:new
是一个&#34;接口存根&#34;对于create
,edit
就像update
一样,默认情况下他们不会做任何事情,他们只会向您发送实际操作的界面。
然而,操作本身会使用适当的HTTP动词(POST
,DELETE
等)发布到资源的路径,这几乎就是什么每个人的建议。但是,知道链接只能GET
(表单可以完成剩下的工作)非常重要。要创建链接问题DELETE
,您必须使用Rails&#39;来扩充它。助手。这是每个人的建议。如果JavaScript被禁用(如果你关心人类用户的百分比非常低),这将无法发挥作用。
你要做的是相同的&#34;接口存根&#34;为destroy
。您可以将其命名为delete
并相应地命名。 它并不常见,全部。
但是,如果 对您来说很常见,请考虑建立路由关注,甚至是您自己的帮助者。我已经看到API中几乎没有用户界面的需求,因此不需要默认帮助者new
或edit
。
答案 2 :(得分:1)
删除对象的标准操作称为destroy
,是resources :items
定义的七条路线之一。
您可以使用link_to "Delete", item_path(@item), method: :delete
在您的示例中调用它。
您永远不应该使用GET请求执行破坏性操作。
答案 3 :(得分:1)
我必须包括:手动删除作为成员的动作
不,你不需要。
查看Rails' guide on resourceful routing了解更多信息:
如其他答案中所述,您必须使用以下内容调用destroy
路径助手:
<%= link_to "Destroy", items_destroy_path(@item), method: :delete %>
您还需要在JS中添加Rails UJS
才能使其正常运行。