0

我有一个控制器,它对一个名为“问题”的资源具有正常的 CRUD 操作。问题表有一个名为已发布的布尔值,用于保存每个实例的状态。当一个问题将发布的布尔值设置为 true 时,问题的所有其他实例都应设置为 false。

我的问题是关于issues_controller.rb。现在,我没有将已发布的布尔值列为 attr_accessible。我的想法是我的视图中有一个按钮可以路由到特定的操作:

def publish
  // before_filter to set all the issues' publish column to false
  // update_attribute to set publish column to true
end

def surpress
  // update_attribute to set this issues publish column to false
end

在进行了一些研究并重新考虑了我的方法之后,我认为创建某种新的控制器可能会更好——published_issues_controller.rb 使用更多资源丰富的路由:

def create
  // same as the publish method above
end

def destroy
  // same as surpress method above
end

这是我的第一个 Rails 应用程序 - 任何关于这些方法(或完全不同的方法)是否最好的任何见解都将不胜感激。

4

2 回答 2

1

当一个问题将发布的布尔值设置为真时,问题的所有其他实例都应设置为假

这对我来说似乎是一个奇怪的业务需求?

无论如何,我会使用您记录的控制器操作,但不会使用 before 过滤器

# routes
resources :issues do
  member do
    post 'publish' # might want put instead of post?
    post 'surpress' 
  end
end

控制器

def publish
  issue = Issue.find(params[:id])
  Issue.transaction do
    issue.publish!
  end
  # ... redirect, etc...
end

模型

def publish!
  published = true
  # set 'All' other issues [published = false]
  # maybe it is only ones that are somehow related to this one? same project?
  save!
end
于 2012-12-28T03:32:20.947 回答
0

是的,在你的 CRUD 中包含 REST(实际上非​​常相似),你就在那里。

resources :issues使用 REST ,您只需config/routes.rb

然后是一些标准动作。

rails 指南甚至将它们列在 CRUD 下:

http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

所以,是的,创造和毁灭更好。

如果您只是实现它们,最佳实践是使用:only =>:except =>限制它们的路由。

于 2012-12-28T03:05:36.307 回答