我使用rails生成的脚手架输入来自条目:CRUD操作。
如果我想在桌子上进行另一项操作,例如默认的“显示,编辑,存档”,就像图书馆书籍“签入”一样,那么会将状态更新为“已签入”......
使用模型和控制器更新的正确方法是什么? (使用mongodb)
更好地说明:拥有多项自定义操作的最佳方式是什么?可以把它想象成许多多用途的“Facebook喜欢”。
在桌面上,行动列表“打这个”,“看看这个”......
答案 0 :(得分:1)
有很多方法可以解决这个问题,但我通常喜欢在自己的控制器动作中用它自己的路径来隔离这样的动作。
为了保持整洁,我建议在模型中添加一个更新您关注的属性的方法。如果您不关心验证,可以使用update_attribute
。此方法会跳过验证并保存到数据库
class LibraryBook < ActiveRecord::Base
def check_in!
self.update_attribute(:checked_in, true)
end
end
您需要更新index.html.erb
视图以添加更新单个记录的链接。这还需要添加路线。由于您要更新记录,因此您需要使用PUT HTTP动词。
resources :library_books do
match :check_in, on: :member, via: :put # creates a route called check_in_library_book
end
添加链接
link_to check_in_library_book_path(library_book), method: :put
现在,您需要在控制器中添加调用#check_in!
方法的操作。
class LibraryBooksController < ApplicationController
def check_in
@library_book = LibraryBook.find(params[:id])
if @library_book.check_in!
# Handle the success
else
# Handle the Failure
end
end
end
答案 1 :(得分:0)
在我看来,处理这种状态工作流程的最佳方法是根据事件来考虑它,然后将状态视为最近的事件 。我通常会创建一个event_type
表,其中包含name
和code
(因此,例如分别为Check In
和CHECK_IN
的名称和代码),然后是{ {1}}表格带有event
,时间戳,通常是某种用户ID或IP地址,或两者兼而有之。
然后你可以这样说:
event_type_id
那里也有“审计线索”的宝石,但在我(有限的)经验中它们并不是很好。
这与MongoDB没有对话,实际上可能与Mongo不兼容,但希望它至少能指向正确的方向或给你一些想法。