我是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。
感谢您的帮助
答案 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
。这意味着每个用户只拥有一个个人资料,他们可以填充&amp;编辑。
关于你的问题,有以下几点:
以下是如何做到这一点:
# 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
对象。
这可以做几件事:
始终确保每个用户都有一个
Profile
(您不必费心去做#34;创建&#34;个人资料)。- 醇>
使您能够仅对已创建的
Profile
上的输入数据进行验证(不必须猜测它是否已经完成)。
-
如果您正在获取未定义的方法build_profile
,则表示您的关联不正确。
所有单数关联都有build_[association]
作为定义的实例方法。我提供的代码会为build_profile
关联触发has_one
。这是唯一一次&#34; undefined&#34;如果该关联是复数的
-
<强>更新强>
这表示路由错误。
考虑到它出现在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'