尝试显示个人资料页面
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 服务器当前 运行 如果您想查看它的运行情况:
在您的路线中,您将其设置为
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
我正在尝试使用设计在 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 服务器当前 运行 如果您想查看它的运行情况:
在您的路线中,您将其设置为
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