允许用户在rails 4中编辑其配置文件字段

时间:2015-04-16 00:43:38

标签: ruby-on-rails ruby ruby-on-rails-4 devise user-profile

我有一个新问题。

我想做什么?

我已为每位玩家创建了个人资料,现在我想让用户修改他们的个人资料。

此配置文件的一部分采用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

备注:

  1. 我有个人资料控制器
  2. 我有这些页面:
    • show.html.erb
    • index.html.erb
  3. 现在我的问题是:

    *如何为每个用户个人资料制作编辑页面, 考虑到每个用户都编辑自己的个人资料?

    用户编辑字段后,我希望将其反映在页面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 %>
    

    提前致谢

1 个答案:

答案 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方法。