1

对于我的 Rails 应用程序,我正在尝试为我的用户创建一个随机永久链接,因此它不是 localhost:3000/users/:id,而是 localhost:3000/users/permalink。

我已关注此处发布的帖子: 如何使 ID 成为 Rails 中的随机 8 位字母数字?

在发布之后,我已经能够为我的用户创建随机永久链接列和页面,但无法让子页面正常工作。对于我的用户,我目前有子页面:关注者等。

问题:页面当前路由到 localhost:3000/users/ :id/followers 等。但是有人知道如何修复 routes.rb 以便我也可以将这些页面路由到 localhost:3000/users/ permalink/followers 等。

路线.rb

match 'users/:permalink' => 'users#show', :as => "show_user"

resources :users do
  member do
    get :followers
  end
end

用户.rb

attr_accessible :permalink

before_create :make_it_permalink

def make_it_permalink
  self.permalink = SecureRandom.base64(8)
end

users_controller.rb

def show
  @user = User.find_by_permalink(params[:permalink])
end

def followers
  @title = "Followers"
  @user = User.find(params[:id])
  @users = @user.followers.page(params[:page]).per_page(5)
  render 'show_follow'
end

用户/_header.html.erb

<%= render 'users/followerstats' %>

用户/_followerstats.html.erb

<a href = "<%= followers_user_path(@user) %>">
    My Followers ( <%= @user.followers.count %> )
</a>

用户/show_follow.html.erb

<div class = "container">
  <%= render 'header' %>
  <% provide(:title, @title) %>
  <div class="row">
    <div class="span12"> 
      <h4><%= @title %></h4>
      <% if @users.any? %>
        <ul class="users">
          <%= render @users %>
        </ul>
        <%= will_paginate %>
      <% end %>
   /div>
</div>
4

2 回答 2

1

我通过添加以下内容使其工作:

路线.rb

match 'users/:permalink/followers' => 'users#followers', :as => "followers_user"

users_controller.rb

def followers
    @title = "Followers"
    @user = User.find_by_permalink(params[:permalink])
    @users = @user.followers.page(params[:page]).per_page(5)
    render 'show_follow'
end

用户/_followerstats.html.erb

<a href = "<%= followers_user_path(@user.permalink) %>">
   My Followers ( <%= @user.followers.count %> )
</a>

*****更新:**

根据@Benjamin Sinclaire 的建议并在此处发布(在 Rails 中创建唯一令牌的最佳方式?),我修复了 user.rb 中的 make_it_permalink:

def make_it_permalink
    loop do
      # this can create permalink with random 8 digit alphanumeric
      self.permalink = SecureRandom.urlsafe_base64(8)
      break self.permalink unless User.where(permalink: self.permalink).exists?
    end
end
于 2013-05-06T03:52:14.877 回答
0

好的,你在我写作的时候发现了它:)

还要小心你的make_it_permalink功能。2 个用户获得与您的代码相同的永久链接的可能性很小。我建议您将其更改为:

def make_it_permalink
  begin
    self.permalink = SecureRandom.base64(8)
  end while User.exists?(:permalink => self.permalink)
end
于 2013-05-06T03:55:18.370 回答