尝试显示个人资料页面

Trying to make individual profile pages appear

我正在尝试使用设计在 Rails 4 上的 Ruby 上创建一个 Facebook 类型的网站。我试图实现的功能之一是个人资料页面,您可以在其中转到特定的 URL 以获取某人的用户名并查看该用户的状态。

最初,我的 /app/views/profiles/show.html.erb 文件中的相关代码是这样的:

<% if @statuses %>
    <% statuses.each do |status| %>
        <div class="well">
            <% status.content %>
            <hr />

这在 Profiles#show 中给了我一个 NameError。在其他地方,有人建议我将第二行的 statuses.each do 更改为 @statuses.each do 。此时,个人资料页面现已加载,但无论如何它仍会显示某个特定用户的状态。换句话说,如果我有一个名为 nancydrew 的用户,一个名为 britneyspears 的用户,以及一个名为 nickiminaj[=32] 的用户=],转到“/britneyspears”或“/nickiminaj”仍会显示 nancydrew 的状态(而不是 britneyspears 或 nickiminaj 各自的状态)。访问“/nancydrew”按预期工作。

这是我的 github 存储库的 link:

https://github.com/yamilethmedina/wheels_registration

rails 服务器当前 运行 如果您想查看它的运行情况:

https://wheels-registration-yamilethmedina.c9.io/

在您的路线中,您将其设置为

get "/:id", to: "profiles#show"

这意味着在您的控制器中,您需要使用 params[:id] 而不是 params[:user_id]。此外,如果您要使用 /britneyspears、/nickiminaj 等,在配置文件下调用这些 profile_name 更有意义,例如

get "/profile/:profile_name", to: "profiles#show"

@user = User.where(profile_name: params[:profile_name]).limit(1).first

您似乎为配置文件定义了 2 条路由#show

第一条路线覆盖了第二条路线,这是您希望在控制器方法中使用的路线。

删除顶级配置文件#show definition

配置文件路由参数应该解释它的用途。将 :id 更改为 :profile_name 或您传递的任何属性。

get "/:profile_name", to: "profiles#show"

配置文件控制器可以大大清理

class ProfilesController < ApplicationController
  def show
    if user
      render action: :show
    else
      render file: "public/404", status: 404, formats: [:html]
    end
  end

  private

  def user
    User.find_by(profile_name: params[:profile_name])
  end

  def statuses
    user.statuses
  end

  helper_method :user, :statuses
end

并且您的视图可以使用辅助方法,而不是每个操作都使用乱七八糟的实例变量。

<div class ="page-header">
    <h1><%= user.full_name %></h1>
</div>

<% if statuses.any? %>
  <% statuses.each do |status| %>
    <div class="well">
      <% status.content %>
      <hr />
      <%= link_to time_ago_in_words(status.created_at), status_path(status) %> ago
    </div>
  <% end %>
<% end %>

顶部答案中的变量有点偏差和一些小东西。

routes.rb

get '/:profile_name', to: 'profiles#show', as: :profile

已添加 as: :profile 您可以使用

=link_to 'John Doe', profile_path(@user)

profiles_controller.rb

暂时不需要比这更复杂。

class ProfilesController < ApplicationController
  before_action :set_user, only: [:show]

  def show
    if @user
      render action: :show
    else
      render file: "public/404", status: 404, formats: [:html]
    end
  end

  private

  def set_user
    @user = User.where(profile_name: params[:profile_name]).first
  end

end

profiles/show.html.erb

<div class ="page-header">
    <h1><%= @user.full_name %></h1>
</div>

<% if @user.statuses.any? %>
  <% @user.statuses.each do |status| %>
    <div class="well">
      <% status.content %>
      <hr />
      <%= link_to time_ago_in_words(status.created_at), status_path(status) %> ago
    </div>
  <% end %>
<% end %>

registrations_controller.rb

您忘记将用户的个人资料名称列入白名单。

class RegistrationsController < Devise::RegistrationsController

  private

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

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