我有一个新问题。
我想做什么?
我已为每位玩家创建了个人资料,现在我想让用户修改他们的个人资料。
此配置文件的一部分采用devise
表,第二个表名为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(不是_edit,因为缺少模板)**
<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 %>
提前致谢
答案 0 :(得分:4)
显示来显示用户个人资料,而不是编辑它 - 这就是导轨方式。
我建议你跳过并阅读rails资源路由:http://guides.rubyonrails.org/routing.html - 这包括路由和CRUD。
考虑您拥有资源,:个人资料 - 在您的路线中,这可以声明为:
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
现在我们有了路线,让我们从控制器的角度来看一下 - 我会专注于编辑/更新,因为这是你的问题:
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
因为我们的路线是按照我们的个人资料的预期设置的,所以我们的表格非常简单,因为铁路可以推断一切。
<强> 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方法。