使用Devise我想显示用户帐户信息,例如个人资料名称,第一个&我的rails应用程序中另一个名为profile page的页面上的姓氏等。
我创建了一个名为profiles的控制器,其中包含一个名为profile / show的视图 在控制器中添加了以下代码
def show
@user = User.find_by_profile_name(params[:id])
if @user
render action: :show
else
render file: 'public/404', status: 404, formats: [:html]
end
end
end
在视图个人资料/节目中,我有以下代码
<%= @user.profile_name %>
并且路线是'profile / show'。
我的问题是,当我执行以上所有操作时,用户的个人资料名称仍未显示在个人资料页面上?它没有出现错误,只是没有显示。我不确定我错过了什么代码。我检查了控制台,用户确实有一个配置文件名称保存到该ID,这也是设计帐户设置。所以我不确定如何显示这些信息?
答案 0 :(得分:1)
在Rails中,您通常会将其设置为跟随约束而不是配置:
# config/routes.rb
resources :users, only: [:show, :index]
# app/models/user.rb
class User < ActiveRecord::Base
# ...
def self.find_by_uid!(uid)
User.find_by!("profile_name = :p OR id = :p", p: uid)
end
end
# app/controllers/users_controller.rb
class UsersController
# GET /users/:id
def show
@user = User.find_by_uid!(params[:id])
# Rails does the magic.
end
# GET /users
def index
@users = User.all
end
end
<%- # app/views/users/show.html.erb -%>
<h1><%= @user.profile_name %></h1>
此处唯一的特殊部分是,在用户模型中,我们创建了一个将按id
或profile_name
进行查询的类方法。这很重要的原因是它允许您按预期使用link_to(@user)
和redirect_to(@user)
。
这也是我们使用resources :users
的原因。当路由名称和模型排队时,Rails多态路由处理程序能够完成它们的工作。如果你想使用/profiles
那么好但从不/profiles/show
- 包括路线中的动作会破坏REST的整个目的。
show动作默认会呈现users/show.html.erb
。所以你很少需要在你的控制器中显式渲染。
render action: :foo
仅在您想要呈现与另一个动作同名的模板时使用,通常使用如下:
def create
@something = Something.new
if @something.save
redirect_to(@something)
else
render action: :new # renders views/something/new.html.erb
end
end
如果您想显式呈现模板,可以执行render :foo
或render "foo/bar"
。
当您使用find
或find_by!
时,如果找不到默认情况下将呈现静态404模板的记录,则会引发异常。在您的操作中重现此错误处理是不可取的,因为它违反了DRY原则。