我正在尝试使用设计在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服务器当前正在运行:
答案 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)
最佳答案中的变量有点偏差和一些小事。
get '/:profile_name', to: 'profiles#show', as: :profile
添加了as: :profile
,您可以使用,
=link_to 'John Doe', profile_path(@user)
暂时不应该比这更复杂。
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
<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 %>
您忘记将用户的个人资料名称列入白名单。
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