我需要让用户选择根路径(或获取)作为他创建的许多页面之一。这意味着,我希望能够创建页面“精彩页面”并将其设置为首页(http://example.com/)。
这一切都可能吗?我已尝试将用户发送到固定操作并将用户重定向到所选操作,但这样就留下了这样的路线:http://example.com/page/8
我想要的结果是:http://example.com/ (而页面是用户选择的页面。)
感谢任何帮助:)
编辑:我需要澄清一下。我希望用户能够选择页面或照片。这意味着我需要用户能够选择控制器和操作。
这样的事情:
constraints(Subdomain) do
get "/" => '#{user_selected_controller}#{user_selected_action}/#{:id}'
end
上面的代码完全错误。但我认为它说明了我想要实现的目标。
答案 0 :(得分:0)
您应该从控制器显式呈现页面视图。
配置/ routes.rb中
root to: 'home#index'
控制器/ home_controller.rb:
def index
@page = #get fantastic page
render 'pages/page', page: @page
end
答案 1 :(得分:0)
我解决了这个问题不是通过路由,而是通过用户表创建页面和图库的多态关联。像这样:
首先创建多态关联
# 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
这样我可以通过users.home变量加载相关资源,同时使用到用户控制器主页操作的正常路由。
这可能是一个效率低下的解决方案,但它是我唯一能想到的解决方案。请随时提出改进建议:)