RESTful会员资格

时间:2010-05-04 11:26:32

标签: ruby-on-rails rest

我目前正试图设计一个RESTful MembershipsController。控制器操作更新仅用于促销,禁止,批准......成员。要调用更新操作,URL必须包含名为type的带有适当值的Parameter。 我不太确定这是否真的是RESTful设计。我是否应该引入单独的行动来促进......成员?

class MembershipsController < ApplicationController
 def update
    @membership= Membership.find params[:id]
    if Membership.aasm_events.keys.include?(params[:type].to_sym) #[:ban, :promote,...]     
      @membership.send("#{params[:type]}!")
      render :partial => 'update_membership'
    end
  end
end

3 个答案:

答案 0 :(得分:3)

都不是。控制器应该处理的唯一“动作”是GET,PUT,POST,DELETE(+其他http动词)。我意识到在标有“rails”的问题上发布这个是异端,但今天我并不在意。

一种RESTful方法是为每个操作创建新的“处理资源”,并将成员POST到该资源以调用操作。

当我说创建一个新资源时,您可以将其解释为创建一个新控制器。

答案 1 :(得分:0)

对我来说,这是你不应该努力遵守REST约定的情况之一。您的模型似乎不符合传统的CRUD概念,并且通过HTTP动词区分动作的RESTful原则似乎也不属于此。

如果我是你,我会将这一行动分成不同的行动,以满足您对会员资格的需求(尽可能保持干净)。这将使控制器代码更具可读性。通过创建一些路线,我还可以使视图代码更清晰(promote_membership_path等)。但那只是我:),所以看看最适合你的是什么。

编辑:

这篇文章解释了我的观点:http://www.therailsway.com/2009/6/22/taking-things-too-far-rest

答案 2 :(得分:0)

嗯,有不止一种方法可以做。你应该问自己的问题是,有多少州?新状态多久会被添加一次?等

如果没有那么多状态,我会为查找创建单独的操作+ a之前的过滤器,但我认为这更像是个人偏好。如果你真的想保持简短,你可以把每个方法放在一行。所以:

class MembershipsController < ApplicationController
  before_filter :find_membership

  def ban;     @membership.ban!;     render :partial => 'update_membership' end
  def promote; @membership.promote!; render :partial => 'update_membership' end

  protected

  def find_membership
    @membership = Membership.find(params[:id)
  end
end

回答你的问题是否是RESTful:是的,你的更新方法完全是RESTful,但请记住,PUT应该是幂等的。所以,如果我执行两次相同的方法,结果是否相同?即如果我禁止用户并再次禁止他会怎么样?