如何将请求重定向到current_user的记录并同时屏蔽路由?

时间:2015-03-06 05:16:33

标签: ruby-on-rails ruby-on-rails-4 routing

每个User has_one :family_tree

因此,family_tree路线看起来像普通resources :family_trees

我有一条看起来像这样的路线:

  get "dashboard/my_tree" => "dashboard#my_tree", as: :my_tree, path: "/my_tree"

我想要发生的是,每当有人前往family_tree/:my_id时,他们都应该被重定向到(或只是显示网址路径)/my_tree。请注意::my_id是属于family_tree的{​​{1}}的ID。

问题是我的current_user控制器操作如下所示:

FamilyTree#Show

我的 def show @user = @family_tree.user @memberships = @family_tree.memberships @memberships_grouped_by_relations = @memberships.includes(user: :family_tree).group_by(&:relation) @nodes = @family_tree.nodes render "dashboard/my_tree" end 看起来像这样:

DashboardController#MyTree

两者都有效,但我不知道如何屏蔽 def my_tree @user = current_user @family_tree = @user.family_tree @memberships_grouped_by_relations = @family_tree.memberships.group_by(&:relation) end 的网址以重定向到family_tree/51。但是,显然,我不希望my_tree的所有请求都显示family_tree/:id。例如。如果与/my_tree相关联的family_tree为current_user,则当该用户转到id=51时,该网址应为'family_tree / 52`。

1 个答案:

答案 0 :(得分:0)

# app/controllers/family_trees_controller.rb
class FamilyTreesController < ApplicationController

  # family_tree GET    /family_trees/:id(.:format)
  #
  # @note !IMPORTANT
  #   Should only have 1 or 2 instance vars per action
  def show
    # @user = @family_tree.user #=> not needed, available on the primary instance var (@family_tree)
    if current_user == family_tree.user
      redirect_to my_tree_index_path
    else
      # @memberships = @family_tree.memberships
      # @memberships_grouped_by_relations #=> too long of a name!
      #                                       There is currently only one grouped membership,
      #                                       why not rename it to:
      @grouped_memberships = family_tree.memberships.includes(user: :family_tree).group_by(&:relation)
      # Shouldn't create another ivar if it's available on the primary ivar
      # @nodes = @family_tree.nodes
    end
  end

  protected

  def family_tree
    @family_tree ||= FamilyTree.find(params[:id])
  end
end

# app/controllers/my_trees_controller.rb
class MyTreesController < ApplicationController

  # my_tree_index GET    /my_tree(.:format)
  def index
    @grouped_memberships = current_user.family_tree.memberships.group_by(&:relation)
  end
end

路线:

# config/routes.rb
My::Application.routes.draw do
  resources :family_trees
  resources :my_tree, only: :index
end