0

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

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 为“回滚”的组件。

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

4

2 回答 2

1

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

resources :components do
  collection do
    get :rollback
  end
end

然后link_to将按预期工作。

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

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

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

希望这可以帮助。

于 2012-11-16T09:41:27.557 回答
1

这将起作用

路线.rb

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

在视图中

<%=link_to 'Rollback', rollback_path%>
于 2012-11-16T09:47:57.090 回答