2009-10-23 111 views
1

我有一个模型,白色标签和用户的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。

但我不喜欢这么多。有没有更好的方法来完成它?

回答

1

好吧,我终于解决了我的问题。

每个白色标签都有自己的子域(感谢subdomain_fu),所以我只需要在我的路线单一资源白色标签上做我的current_whitelabel动作,如果我想要做别人whitelabels行动,我只需要切换子域。

感谢EmFi试图回答我的奇怪问题。

0

在你的控制器动作,你可以这样做:

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版本,那应该没问题。

+0

谢谢您的回答EMFI,但它并没有回答我的问题。 也许我的问题不清楚。 我对所有whitelabels但其中有些只是针对当前的一些行动。 所以我需要两种类型的网址: /whitelabels/ID /所有用户的whitelabels行动。 之类的东西/ my_current_whitelabel /仪表板。 我必须做两个不同的资源来做到这一点? – lou 2009-10-23 19:42:25

+0

你的问题绝对不清楚。我已经更新了我的答案,以解决您评论中提到的问题。 – EmFi 2009-10-23 19:47:32

+0

好,感谢我EMFI认为有一个更轨的方式来做到这一点,但也许不会。所以我会做命名路线。 – lou 2009-10-23 19:52:20