[英]How do I connect routes to partials?
我正在開發一個 Rails 應用程序,其中一個選項卡(用戶顯示視圖)有一個部分是內部導航欄。 共有三個鏈接( match 、 activity 、 message ),每個鏈接對應於內部導航欄右側呈現的不同部分。
每個部分在我的 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.