繁体   English   中英

如何将路线连接到部分?

[英]How do I connect routes to partials?

我正在开发一个 Rails 应用程序,其中一个选项卡(用户显示视图)有一个部分是内部导航栏。 共有三个链接( matchactivitymessage ),每个链接对应于内部导航栏右侧呈现的不同部分。

每个部分在我的 routes.rb 文件中都有一个对应的路由,但它们都在一个 controller 操作( user#show )中呈现。 结果,我的内部导航栏链接单独将页面带到正确的路线,但没有成功呈现部分。 为了解决这个问题,我在视图中检查路线的终点是什么,并相应地渲染适当的部分。

我想有一种更理想的方式来完成我想做的事情,但我很难弄清楚那可能是什么。

我知道我可以使用单独的视图文件而不是局部文件来解决这个问题,但是为了模块化,我宁愿不朝那个方向前进。 有没有更好的方法将路线链接到适当的部分?

路线.rb

Rails.application.routes.draw do
  mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
  resources :messages
  resources :replies
  resources :posts
  resources :organizations
  resources :users
  resources :sessions
  resources :matches

  root "welcome#index"
  get "/users/:id/match", to: "users#show", as: "user_match"
  get "/users/:id/activity", to: "users#show", as: "user_activity"
  get "/users/:id/message", to: "users#show", as: "user_message"
  
end

users_controller

class UsersController < ApplicationController
    skip_before_action :verify_authenticity_token, only: [:create]

    def show
        @user = User.find(params[:id])
    end
    
    def new
        @user = User.new
    end
    
    def create
        @user = User.new(user_params)
        if @user.save
            log_in @user
            flash[:notice] = "Your account was created!"
            redirect_to @user
        else
            flash[:alert] = @user.errors.full_messages.join(", ")
            render 'new'
        end
    end
    
    private

    def user_params
        params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
    end 

end

/users/show.html.erb

<div class="row">
  <% if @user.id == current_user.id %>
    <div class="col-md-2 justify-content-start">
      <div>
        <ul>
          <li>
            <%= link_to(user_message_path(current_user.id)) do %>
              <%= fa_icon "envelope", text: "Messages" %>
            <% end %>
          </li>
          <li>
            <%= link_to(user_activity_path(current_user.id)) do %>
              <%= fa_icon "comments", text: "Activity" %>
            <% end %>
          </li>
          <li>
            <%= link_to(user_match_path(current_user.id)) do %>
              <%= fa_icon "handshake-o", text: "Matches" %>
            <% end %>
          </li>
          </ul>
      </div>
    </div>
  <% end %>
  <div class="col-md-10 justify-content-center">
    <% last = request.path.split('/').last%>
    <% if @user.id == current_user.id %>
      <% if last == "match" %>
        <%= render partial: "match" %>
      <% elsif last == "activity" %>
        <%= render partial: "activity" %>
      <% elsif last == "message" %>
        <%= render partial: "message" %>
      <% else %>
        <%= render partial: "home"%>
      <% end %>
    <% else %>
      <%= render partial: "home" %>
    <% end %>
  </div>
</div>

您可以采取一些替代方法,例如将每个子页面设置为新的 controller(UserMatchesController 等)并直接路由到它们,或者使用 AJAX 动态加载子部分,但您的方法不是坏的。 我要做的改进是使子页面成为路由中的命名段,并具有将其锁定的约束:

get "/users/:id/:section", to: "users#show", constraints: { section: /^(message|home|match|activity)$/ }

您可以通过将该参数作为参数传递来链接到每个部分:

link_to user_path(current_user.id, section: "message")

然后在您的模板中,类似于:

render partial: params[:section]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM