单一资源和多种资源

时间:2009-10-23 19:23:43

标签: ruby-on-rails

我有一个模型Whitelabel和一个用户has_many:whitelables

我有一个自定义方法current_whitelabel(如current_user的authlogic或restful_auth)

我希望我的用户管理他们的白标签(例如:edit_whitelabels_path(id))。

但是当我引用current_whitelabel时,我不想在参数中发送whitelabel ID。

所以我的想法是创建两个资源:map.resources whitelabels和map.resource whitelabel。

但我不太喜欢这个。是否有更性感的方式来实现它?

2 个答案:

答案 0 :(得分:1)

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

每个whitelabel都有自己的子域名(感谢subdomain_fu),所以我只需要在我的路由中使用单个资源whitelabel来对我的current_whitelabel执行操作,如果我想对其他白标签执行操作,我只需要切换子域名

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

答案 1 :(得分:0)

在您的控制器操作中,您可以执行以下操作:

class WhitelabelsController < ActionController
  def edit
    @whitelabel = params[:id] ?  Whitelabel.find(params[:id]) : current_whitelabel
    redirect_to whitelabels_url unless @whitelabel
    ....
  end
  ...
end

现在,rails会将/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控制器中使用上面的代码。这通过对具有相同动作的不同路径使用相同的控制器来保持DRY。资源定义了仪表板操作,因此您还必须将其添加到控制器。但如果您使用的是before_filter版本,则应该没有问题。