Rails:MVC如何使用自定义操作

时间:2013-04-18 20:43:05

标签: ruby-on-rails mongodb model-view-controller

我使用rails生成的脚手架输入来自条目:CRUD操作。

如果我想在桌子上进行另一项操作,例如默认的“显示,编辑,存档”,就像图书馆书籍“签入”一样,那么会将状态更新为“已签入”......

使用模型和控制器更新的正确方法是什么? (使用mongodb)

更好地说明:拥有多项自定义操作的最佳方式是什么?可以把它想象成许多多用途的“Facebook喜欢”。

在桌面上,行动列表“打这个”,“看看这个”......

2 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题,但我通常喜欢在自己的控制器动作中用它自己的路径来隔离这样的动作。

模型

为了保持整洁,我建议在模型中添加一个更新您关注的属性的方法。如果您不关心验证,可以使用update_attribute。此方法会跳过验证并保存到数据库

class LibraryBook < ActiveRecord::Base
  def check_in!
    self.update_attribute(:checked_in, true)
  end
end

视图

您需要更新index.html.erb视图以添加更新单个记录的链接。这还需要添加路线。由于您要更新记录,因此您需要使用PUT HTTP动词。

的routes.rb

resources :library_books do
  match :check_in, on: :member, via: :put # creates a route called check_in_library_book
end

index.html.erb

添加链接

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表,其中包含namecode(因此,例如分别为Check InCHECK_IN的名称和代码),然后是{ {1}}表格带有event,时间戳,通常是某种用户ID或IP地址,或两者兼而有之。

然后你可以这样说:

event_type_id

那里也有“审计线索”的宝石,但在我(有限的)经验中它们并不是很好。

这与MongoDB没有对话,实际上可能与Mongo不兼容,但希望它至少能指向正确的方向或给你一些想法。