Rails - 向scaffold创建的控制器添加动作

时间:2012-11-16 09:29:41

标签: ruby-on-rails controller routes action

我正在尝试向控制器添加一个名为rollback的操作。 正如我所见,我应该做的唯一事情是写新动作:

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'动作轨道使用new_component_path(没有s,单数),但是如果我写rollback_component_path它会抛出一个错误,我看不到视图。

2 个答案:

答案 0 :(得分:1)

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

resources :components do
  collection do
    get :rollback
  end
end

然后link_to将按预期工作。

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

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

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

希望这有帮助。

答案 1 :(得分:1)

这将有效

的routes.rb

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

在视图中

<%=link_to 'Rollback', rollback_path%>