【问题标题】:Rails: MVC How to use custom actionsRails:MVC 如何使用自定义操作
【发布时间】:2013-04-19 08:28:15
【问题描述】:

我有一个使用 rails 生成的脚手架的条目的表输出:CRUD ops。

如果我想在桌子上进行其他操作,例如默认的“显示、编辑、删除”,例如图书馆图书“签到”,这会将状态更新为“签到”...

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

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

在桌子上,“打这个”、“看看这个”的动作列表......

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 如果您的条目只签入或不签入,我会说这是一个很好的方法。如果是这样的话,这种方式可能比我的方式更好。如果有更多可能的状态,而不仅仅是签入或不签入,我认为我的方式可能会更好。
    • 我完全同意。此解决方案最适合单个对象的二元条件。
    【解决方案2】:

    在我看来,处理此类状态工作流的最佳方式是根据事件来考虑它,然后将状态视为最近的事件 .我通常使用namecode 创建一个event_type 表(例如,分别为名称和代码Check InCHECK_IN),然后创建一个event 表和event_type_id,时间戳,通常是某种用户 ID 或 IP 地址,或两者兼而有之。

    那么你可以这样说:

    class Thing < ActiveRecord::Base
      has_many :events
    
      def status
        events.order("created_at DESC").first.event_type.name
      end
    end
    

    那里也有“审计跟踪”宝石,但根据我的(有限的)经验,它们不是很好。

    这与 MongoDB 无关,实际上可能与 Mongo 不兼容,但希望它至少为您指明正确的方向或给您一些想法。

    【讨论】:

    • 当 routes.rb 中没有任何内容时,如何将其添加到已经制作的“条目”模型和控制器中?
    • 给你的 event 表一个 entry_id (或者你在 Mongo 中做关联)。然后,当您要签入条目时,创建一个指向该条目的新 CHECK_IN 事件。根据 RESTful 设计理念,我建议将 EntriesController 原样保留。
    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多