尝试制作个人资料页面

时间:2015-04-08 17:20:55

标签: ruby-on-rails ruby ruby-on-rails-4 devise

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

最初,我的/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 的用户,请转到“/ britneyspears”或“/ nickiminaj”仍会显示nancydrew的状态(而不是britneyspears'或nickiminaj的各自状态)。访问“/ nancydrew”按预期工作。

这是我的github存储库的链接:

https://github.com/yamilethmedina/wheels_registration

如果您希望看到它正在运行,那么rails服务器当前正在运行:

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

3 个答案:

答案 0 :(得分:2)

看起来好像您为个人资料#show

定义了2条路线

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

删除顶部个人资料#show definition

配置文件路由参数应该解释它的用途。更改:id to: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 %>

答案 1 :(得分:0)

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

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 :(得分:0)

最佳答案中的变量有点偏差和一些小事。

的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

简档/ 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