允许用户在 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

备注:

  1. 我有一个配置文件控制器
  2. 我有这些页面:
    • 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 方法。