与rails中的设计用户建立has_one关系

时间:2016-01-27 20:13:17

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

我是rails的新手,我很难通过设计用户创建个人资料

这是ProfileController:

class ProfilesController < ApplicationController

  before_action :set_profile, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!

def index
 @profiles = Profile.all
end

def new
 @profile = current_user.build_profile
end

def create
@profile = current_user.build_profiles(profile_params)
redirect_to profiles_path
end

def show

end

def edit

end

def update
@profile.update(profile_params)
redirect_to(profiles_path(@profile))
end

def destroy
@profile.destroy
redirect_to profiles_path
end

private
def profile_params
params.require(:profile).permit(:university, :degree)
end

def set_profile
@profile = Profile.find(params[:id])
end

end

当我运行rails服务器时,我可以提交表单,但没有任何内容存储在模型“Profile”

这里是应该出现数据的index.html.erb:

<h2>profiles</h2>

<% @profiles.each do |profile| %>

  <%= link_to profile do %>
    <%= profile.university %>
  <% end %>
    <%= profile.degree %>

<% end %>

user.rb文件:

has_one :profile

和profile.rb文件:

belongs_to :user

似乎没有任何东西被保存到配置文件模型,并且没有任何内容显示在index.html.erb上。我还创建了一个迁移,以便在配置文件模型中存储user_id。

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

到目前为止,为profile创建user最佳方法是在创建User对象时构建它:

#app/models/user.rb
class User < ActiveRecord::Base
   has_one :profile
   before_create :build_profile
   accepts_nested_attributes_for :profile
end

#app/models/profile.rb
class Profile < ActiveRecord::Base
   belongs_to :user
end

每次创建新的profile时,这将构建一个空白user。这意味着每个用户拥有一个个人资料,他们可以填充&am​​p;编辑。

关于你的问题,有以下几点:

  1. 不要列出&#34;个人资料&#34;使用索引,列出用户和&amp;拉他们的个人资料数据
  2. 如果管理个人资料,请将其嵌套在关联用户模型
  3. 以下是如何做到这一点:

    # config/routes.rb
    resources :users, only: :index
    resource :profile, only: [:show, :update]
    
    #app/controllers/profiles_controller.rb
    class ProfilesController < ApplicationController
       def show
       end
    
       def update
          redirect_to :show if current_user.update profile_params
       end
    
       private
    
       def profile_params
          params.require(:user).permit(profile_attributes: [:name])
       end
    end
    
    #app/views/profiles/show.html.erb
    <%= form_for current_user, url: profile_path do |f| %>
       <%= f.fields_for :profile do |p| %>
          <%= p.text_field :name %>
       <% end %>
       <%= f.submit %>
    <% end %>
    

    <强>更新

    我上面的帖子正是我们所做的。

    它的工作方式非常简单 - 当创建User时(IE他们已经无法填写他们的详细信息),Rails后端自动创建空白 Profile对象。

    这可以做几件事:

      
        
    1. 始终确保每个用户都有一个Profile(您不必费心去做#34;创建&#34;个人资料)。

    2.   
    3. 使您能够仅对已创建的Profile上的输入数据进行验证(必须猜测它是否已经完成)。

    4.   

    -

    如果您正在获取未定义的方法build_profile ,则表示您的关联不正确。

    所有单数关联都有build_[association]作为定义的实例方法。我提供的代码会为build_profile关联触发has_one。这是唯一一次&#34; undefined&#34;如果该关联是复数的

    -

    <强>更新

    enter image description here

    这表示路由错误。

    考虑到它出现在root,我认为问题是here

    #app/views/layouts/application.html.erb
    <%= link_to "Profile", profile_path %>
    

    你没有edit_profile_path - 它应该是profile_path

答案 1 :(得分:0)

它需要为您在crate方法中构建的配置文件进行保存调用。 e.g。

def create
@user = User.new(user_params)
  if @user.save
     redirect_to root_url 
  else
     render :new 
  end
end

如果条件检查是数据保存正确与否。并将示例的用户模型更改为您的个人资料模型

顺便说一下,只要小心复数,我认为它应该使用'build_profile'代替'build_profiles'