基于用户插入的Rails root路径



我需要让用户选择一个root路径(或a get)成为他创建的许多页面之一。这意味着,我希望能够创建页面"奇妙的页面"并将其设置为首页(http://example.com/)。

这根本可能吗?我尝试将用户发送到固定的操作,并将用户重定向到所选的操作,但这给我带来了这样的路线:http://example.com/page/8

我期望的结果是:http://example.com/(虽然该页面是用户选择的页面)。

任何帮助都将受到赞赏:)

编辑:我需要澄清。我希望用户能够选择页面或照片。这意味着我需要用户能够,因此选择控制器和操作。

类似的东西:

constraints(Subdomain) do
    get "/" => '#{user_selected_controller}#{user_selected_action}/#{:id}'
end

上面的代码是完全错误的。但是我认为这说明了我想完成的工作。

您应该从控制器中明确渲染页面视图。

config/routes.rb

root to: 'home#index'

控制器/home_controller.rb:

def index
  @page = #get fantastic page
  render 'pages/page', page: @page
end

i不是通过路由解决了这个问题,而是通过与用户表与页面和画廊建立多态性关联。这样:

首先创建多态关联

# In my page model
has_one :user, :as => :home
# In my Gallery model
has_one :user, :as => :home
# In my User model
belongs_to :home, polymorphic: true

然后,我将其用作Users_controller中的控制器:

def home
    # Multitenant rails app. This refers to user who owns the subdomain visited.
    @user = current_tenant
    # This is not optimal, results in two queries.
    if @user.home_type.classify.constantize.exists?(@user.home_id)
        # This is the same as @page = Page.find(params[:id])
        instance_variable_set("@#{@user.home_type.downcase}", @user.home_type.classify.constantize.find(@user.home_id))
        # this is the same as render 'pages/show', layout: false
        render "#{@user.home_type.downcase.pluralize}/show", layout: false
    else
        redirect_to photos_path
    end
end

我的路线看起来像这样:

# Set a page as the home screen
post 'pages/set_home/:id' => 'pages#set_home', as: :set_home_page
# User selected Home screen
get "/" => 'users#home'

设置主页:

# In pages_controller
  def set_home
    @user = current_user
    @user.home = @page
    if @user.save
      redirect_to pages_path, notice: "Home screen set to #{@page.title}"
    else
      redirect_to pages_path, alert: "An error occured. Home not set."
    end
  end

这样,我可以通过用户加载相关资源。home变量,同时使用正常路由到用户控制器主动操作。

这可能是一个效率低下的解决方案,但它是我唯一能想到的解决方案。请随时建议改进:)

最新更新