允许用户在 rails 4 中编辑他们的个人资料字段
Allow users to edit their profile fields in rails 4
我有一个新问题。
我想做什么?
我已经为每个玩家创建了个人资料,现在我想允许用户编辑他们的个人资料。
此配置文件的一部分采用 devise
table,第二个 table 称为 profiles
。
设计: 捕获用户名、密码和电子邮件
配置文件: 捕获个人信息
配置文件架构
create_table "profiles", force: :cascade do |t|
t.text "about"
t.string "fb"
t.string "skype"
t.string "birthday"
t.string "twitter"
t.string "steam"
t.string "gender"
t.string "occupation"
t.string "location"
t.string "interest"
end
我的profile_controller.rb(已更新)
class ProfileController < ApplicationController
def index
@profile = Player.all
end
def show
@profile = Player.find_by(nick: params[:nick])
end
def edit
# use this to populate a form in your view
@profile = Player.find_by(nick: params[:nick])
end
def update
@profile = Player.find_by(nick: params[:nick])
if @profile.update_attributes(profiles_params)
redirect_to(:action => "show", :profile => @profile.nick)
else
render("index")
end
end
private
def profiles_params
params.require(:profiles).permit(:about, :skype)
end
end
耙路线
profiles GET /profiles(.:format) profiles#index
GET /profiles/:nick/edit(.:format) profiles#edit
GET /profiles/:nick(.:format) profiles#show
PATCH /profiles/:nick(.:format) profiles#update
PUT /profiles/:nick(.:format) profiles#update
Routes.rb
devise_for :players
resources :profile, param: :nick
resources :profiles, only: [:index, :show, :edit, :update], param: :nick
备注:
- 我有一个配置文件控制器
- 我有这些页面:
show.html.erb
index.html.erb
现在我的问题是:
*我应该如何为每个用户个人资料制作编辑页面,
考虑到每个用户都编辑自己的个人资料?
一旦用户编辑了一个字段,我希望它反映在页面上 show.html.erb
。我怎样才能做到这一点?*
** show.html.erb **
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="info">
<p><div class="form-group">
<label for="textArea" class="col-lg-2 control-label">About <%= @profile.nick %></label>
<div class="col-lg-10">
<pre style="padding-bottom: 200px;"><%= @profiles.about %>(THIS IS THE ERROR)</pre>
<span class="help-block">In Progress</span>
</div>
</div></p>
</div>
** edit.html.erb(未编辑,因为缺少模板)**
<strong>Testing About</strong>
<%= form_for :profiles do |f| %>
<%= f.label :about %>
<%= f.text_field :about %>
<div class="btn btn-primary">
<a href="http://localhost:3000/profile/<%= @profile.nick %>">
<%= f.submit "Update Profile", :class => 'btn btn-primary' %></a>
</div>
<% end %>
<% end %>
<p>I am editing for</p>
<%= @profile.nick %>
提前致谢
Show 应该用于显示用户个人资料,而不是编辑它 - 这是 rails 方式。
我建议你跳过去阅读 rails 足智多谋的路由:http://guides.rubyonrails.org/routing.html - 这包括路由和 CRUD。
考虑到您拥有资源 :profiles - 在您的路线中,这可以声明为:
resources :profiles
这条路线会自动为您创建所需的路线——在这种情况下,我们似乎只需要索引、显示、编辑和更新,因此可以声明:
resources :profiles, only: [:index, :show, :edit, :update]
我们现在有以下路线,我已经评论过它们的用途:
GET /profiles #show all profiles
GET /profiles/:id #show specific user profile
GET /profiles/:id/edit #edit specific user profile
PATCH /profiles/:id #update a specific profile
现在我们有了路线,让我们从控制器的角度来看这个问题 - 我只想关注 edit/update,因为这是你的问题:
class ProfileController < ApplicationController
def index
#do something
end
def show
# do something
end
def edit
# use this to populate a form in your view
@profile = get_profile
end
def update
@profile = get_profile
if @profile.update_attributes(profile_params)
#do something on success
else
# do something on fail
end
end
private
def profile_params
params.require(:profile).permit(:about, :skype, etc)
end
def get_profile
nick = params[:nick]
if Player.where(username: nick).present?
if Player.where(username: nick).count == 1
Player.includes(:profile).find_by(username: nick).profile
else
raise "Error: Multiple profiles found"
end
else
raise "Error: Profile cannot be found"
end
end
end
您会注意到 'profile_params' 方法,这是 rails 强参数的一部分,并将我们可用于批量分配的属性列入白名单。阅读更多:http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html
因为我们的路线是按照我们的配置文件的预期设置的,所以我们的表格非常简单,因为 rails 可以推断出一切。
edit.html.erb
<%= form_for @profile do |f| %>
<%= f.text_field :about %>
... etc
<% f.submit %> # this will submit to profile#update
<% end %>
进一步阅读form_for:http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for
当然,您还应该为控制器方法添加授权,但希望我已经为您介绍了基本前提。
EDIT1: 关于您的评论,我添加了一个私有方法,用于通过用户名或 ID(调整以适应)定位您的用户个人资料。但就像我说的,阅读链接的阅读材料,这样您就可以了解路由。
EDIT2: 所以考虑到您的进一步评论和您添加到问题中的路线,我已经更新了您的 get_profile 方法。
我有一个新问题。
我想做什么?
我已经为每个玩家创建了个人资料,现在我想允许用户编辑他们的个人资料。
此配置文件的一部分采用 devise
table,第二个 table 称为 profiles
。
设计: 捕获用户名、密码和电子邮件
配置文件: 捕获个人信息
配置文件架构
create_table "profiles", force: :cascade do |t|
t.text "about"
t.string "fb"
t.string "skype"
t.string "birthday"
t.string "twitter"
t.string "steam"
t.string "gender"
t.string "occupation"
t.string "location"
t.string "interest"
end
我的profile_controller.rb(已更新)
class ProfileController < ApplicationController
def index
@profile = Player.all
end
def show
@profile = Player.find_by(nick: params[:nick])
end
def edit
# use this to populate a form in your view
@profile = Player.find_by(nick: params[:nick])
end
def update
@profile = Player.find_by(nick: params[:nick])
if @profile.update_attributes(profiles_params)
redirect_to(:action => "show", :profile => @profile.nick)
else
render("index")
end
end
private
def profiles_params
params.require(:profiles).permit(:about, :skype)
end
end
耙路线
profiles GET /profiles(.:format) profiles#index
GET /profiles/:nick/edit(.:format) profiles#edit
GET /profiles/:nick(.:format) profiles#show
PATCH /profiles/:nick(.:format) profiles#update
PUT /profiles/:nick(.:format) profiles#update
Routes.rb
devise_for :players
resources :profile, param: :nick
resources :profiles, only: [:index, :show, :edit, :update], param: :nick
备注:
- 我有一个配置文件控制器
- 我有这些页面:
show.html.erb
index.html.erb
现在我的问题是:
*我应该如何为每个用户个人资料制作编辑页面, 考虑到每个用户都编辑自己的个人资料?
一旦用户编辑了一个字段,我希望它反映在页面上 show.html.erb
。我怎样才能做到这一点?*
** show.html.erb **
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="info">
<p><div class="form-group">
<label for="textArea" class="col-lg-2 control-label">About <%= @profile.nick %></label>
<div class="col-lg-10">
<pre style="padding-bottom: 200px;"><%= @profiles.about %>(THIS IS THE ERROR)</pre>
<span class="help-block">In Progress</span>
</div>
</div></p>
</div>
** edit.html.erb(未编辑,因为缺少模板)**
<strong>Testing About</strong>
<%= form_for :profiles do |f| %>
<%= f.label :about %>
<%= f.text_field :about %>
<div class="btn btn-primary">
<a href="http://localhost:3000/profile/<%= @profile.nick %>">
<%= f.submit "Update Profile", :class => 'btn btn-primary' %></a>
</div>
<% end %>
<% end %>
<p>I am editing for</p>
<%= @profile.nick %>
提前致谢
Show 应该用于显示用户个人资料,而不是编辑它 - 这是 rails 方式。
我建议你跳过去阅读 rails 足智多谋的路由:http://guides.rubyonrails.org/routing.html - 这包括路由和 CRUD。
考虑到您拥有资源 :profiles - 在您的路线中,这可以声明为:
resources :profiles
这条路线会自动为您创建所需的路线——在这种情况下,我们似乎只需要索引、显示、编辑和更新,因此可以声明:
resources :profiles, only: [:index, :show, :edit, :update]
我们现在有以下路线,我已经评论过它们的用途:
GET /profiles #show all profiles
GET /profiles/:id #show specific user profile
GET /profiles/:id/edit #edit specific user profile
PATCH /profiles/:id #update a specific profile
现在我们有了路线,让我们从控制器的角度来看这个问题 - 我只想关注 edit/update,因为这是你的问题:
class ProfileController < ApplicationController
def index
#do something
end
def show
# do something
end
def edit
# use this to populate a form in your view
@profile = get_profile
end
def update
@profile = get_profile
if @profile.update_attributes(profile_params)
#do something on success
else
# do something on fail
end
end
private
def profile_params
params.require(:profile).permit(:about, :skype, etc)
end
def get_profile
nick = params[:nick]
if Player.where(username: nick).present?
if Player.where(username: nick).count == 1
Player.includes(:profile).find_by(username: nick).profile
else
raise "Error: Multiple profiles found"
end
else
raise "Error: Profile cannot be found"
end
end
end
您会注意到 'profile_params' 方法,这是 rails 强参数的一部分,并将我们可用于批量分配的属性列入白名单。阅读更多:http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html
因为我们的路线是按照我们的配置文件的预期设置的,所以我们的表格非常简单,因为 rails 可以推断出一切。
edit.html.erb
<%= form_for @profile do |f| %>
<%= f.text_field :about %>
... etc
<% f.submit %> # this will submit to profile#update
<% end %>
进一步阅读form_for:http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for
当然,您还应该为控制器方法添加授权,但希望我已经为您介绍了基本前提。
EDIT1: 关于您的评论,我添加了一个私有方法,用于通过用户名或 ID(调整以适应)定位您的用户个人资料。但就像我说的,阅读链接的阅读材料,这样您就可以了解路由。
EDIT2: 所以考虑到您的进一步评论和您添加到问题中的路线,我已经更新了您的 get_profile 方法。