单个资源和多个资源
我有一个模型,白色标签和用户的has_many:whitelables单个资源和多个资源
我有一个自定义的方法current_whitelabel(如authlogic或restful_auth为CURRENT_USER)
我希望我的用户管理他们的whitelabels(即:edit_whitelabels_path(id))。
但是我不想在params中发送whitelabel ID时引用current_whitelabel。
所以我的想法是创建两个资源:map.resources whitelabels和map.resource whitelabel。
但我不喜欢这么多。有没有更好的方法来完成它?
好吧,我终于解决了我的问题。
每个白色标签都有自己的子域(感谢subdomain_fu),所以我只需要在我的路线单一资源白色标签上做我的current_whitelabel动作,如果我想要做别人whitelabels行动,我只需要切换子域。
感谢EmFi试图回答我的奇怪问题。
在你的控制器动作,你可以这样做:
class WhitelabelsController < ActionController
def edit
@whitelabel = params[:id] ? Whitelabel.find(params[:id]) : current_whitelabel
redirect_to whitelabels_url unless @whitelabel
....
end
...
end
现在轨将把/whitelabel/edit
作为/whitelabel/edit/#{current_whitelabel.id}
没有指定的ID。
如果发生这种情况对于多个操作,您可以将它作为之前的过滤器来执行。请务必从个别操作中删除所有@whitelabel = Whitelable.find(params[:id])
行。
class WhitelabelsController < ActionController
before_filter :select_whitelabel, :except => [:index, :new]
def select_whitelabel
@whitelabel = params[:id] ? Whitelabel.find(params[:id]) : current_whitelabel
redirect_to whitelabels_url unless @whitelabel
end
...
end
回答在评论中更明确指出问题: 可以串联使用一个单一的资源与上面的代码有你想要的效果。
配置/ routes.rb中
map.resource :my_whitelabel, :controller => "whitelabels", :member => {:dashboard => :get}
然后在whitelabels控制器使用上述代码。通过对具有相同操作的不同路径使用相同的控制器,可以使事情保持干爽。资源定义了仪表板操作,因此您必须将其添加到控制器。但是如果你使用的是before_filter版本,那应该没问题。
谢谢您的回答EMFI,但它并没有回答我的问题。 也许我的问题不清楚。 我对所有whitelabels但其中有些只是针对当前的一些行动。 所以我需要两种类型的网址: /whitelabels/ID /所有用户的whitelabels行动。 之类的东西/ my_current_whitelabel /仪表板。 我必须做两个不同的资源来做到这一点? – lou 2009-10-23 19:42:25
你的问题绝对不清楚。我已经更新了我的答案,以解决您评论中提到的问题。 – EmFi 2009-10-23 19:47:32
好,感谢我EMFI认为有一个更轨的方式来做到这一点,但也许不会。所以我会做命名路线。 – lou 2009-10-23 19:52:20