【问题标题】:Rails - Add action to controller created by scaffoldRails - 向脚手架创建的控制器添加操作
【发布时间】:2012-11-05 00:17:25
【问题描述】:

我正在尝试向控制器添加一个称为回滚的操作。 正如我所见,我唯一应该做的就是编写新动作:

def rollback
    puts "ROLLBACK!"
    respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @components }
end

修改 routes.rb 文件:

resources :components do
   collection do
      post :rollback, :as => 'rollback'
   end
end

并从某个角度调用操作:

<%= link_to 'Rollback', rollback_components_path %>

但我收到以下错误:

Couldn't find Component with id=rollback
app/controllers/components_controller.rb:18:in `show'

这是因为控制器认为我们正在尝试“显示”到 id 为“rollback”的组件,而不是回滚操作。

对我来说似乎很奇怪的是调用“new”操作 rails 使用 new_component_path(不带 s,单数),但如果我写 rollback_component_path 它会抛出一个错误并且我看不到视图。

【问题讨论】:

  • 我希望您不希望 rollback 操作对数据库执行实际的数据库回滚? (在 Rails 中,事务不会跨越不同的请求——至少默认情况下不会)。

标签: ruby-on-rails controller routes action


【解决方案1】:

在您的路线中,您需要POST,只需单击链接默认为GET,所以要么写

resources :components do
  collection do
    get :rollback
  end
end

然后link_to 将按预期工作。

我假设回滚操作不是幂等的,所以 POST 在这种情况下在语义上更好。

如果您按如下方式编写链接,那么 rails 将为您创建一个内联表单:

link_to 'Rollback', rollback_components_path, :method => 'post'

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这会起作用

    routes.rb

    resources :components
    match "components/rollback" => "components#rollback",  :as => :rollback
    

    在视图中

    <%=link_to 'Rollback', rollback_path%>
    

    【讨论】:

    • 你最后的解释是完全错误的。 POST 与 id 的要求无关。问题是该路由是为 POST 构建的,但他执行的是 GET。
    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    相关资源
    最近更新 更多