如何在个人资料页面上显示设计帐户详细信息

时间:2015-12-14 04:42:08

标签: ruby-on-rails devise

使用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,这也是设计帐户设置。所以我不确定如何显示这些信息?

1 个答案:

答案 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>

此处唯一的特殊部分是,在用户模型中,我们创建了一个将按idprofile_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 :foorender "foo/bar"

当您使用findfind_by!时,如果找不到默认情况下将呈现静态404模板的记录,则会引发异常。在您的操作中重现此错误处理是不可取的,因为它违反了DRY原则。