为什么不存在delete_model_path的标准帮助程序?

时间:2015-10-02 11:58:09

标签: ruby-on-rails ruby-on-rails-4 rails-routing

例如,如果我有一个模型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 操作才能向用户显示确认对话框。有没有更好的方法来完成我想要做的事情?或者我做得对,这是最好的做法吗?

4 个答案:

答案 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;对于createedit就像update一样,默认情况下他们不会做任何事情,他们只会向您发送实际操作的界面。

然而,操作本身会使用适当的HTTP动词(POSTDELETE等)发布到资源的路径,这几乎就是什么每个人的建议。但是,知道链接只能GET (表单可以完成剩下的工作)非常重要。要创建链接问题DELETE,您必须使用Rails&#39;来扩充它。助手。这是每个人的建议。如果JavaScript被禁用(如果你关心人类用户的百分比非常低),这将无法发挥作用。

你要做的是相同的&#34;接口存根&#34;为destroy。您可以将其命名为delete并相应地命名。 它并不常见,全部。

但是,如果 对您来说很常见,请考虑建立路由关注,甚至是您自己的帮助者。我已经看到API中几乎没有用户界面的需求,因此不需要默认帮助者newedit

答案 2 :(得分:1)

删除对象的标准操作称为destroy,是resources :items定义的七条路线之一。

您可以使用link_to "Delete", item_path(@item), method: :delete在您的示例中调用它。

您永远不应该使用GET请求执行破坏性操作。

答案 3 :(得分:1)

  

我必须包括:手动删除作为成员的动作

不,你不需要。

查看Rails' guide on resourceful routing了解更多信息:

enter image description here

如其他答案中所述,您必须使用以下内容调用destroy路径助手:

<%= link_to "Destroy", items_destroy_path(@item), method: :delete %>

您还需要在JS中添加Rails UJS才能使其正常运行。