我目前正试图设计一个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
答案 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应该是幂等的。所以,如果我执行两次相同的方法,结果是否相同?即如果我禁止用户并再次禁止他会怎么样?