嵌套路由和form_for 以及使用has_one 和belongs_to 的模型 [英] nested routes and form_for and models using has_one and belongs_to
问题描述
如何使用嵌套路由映射 has_one 模型,以及如何在 RESTful 数据库之后为/localhost:3000/users/1/profile/new,html.erb 添加 form_for?
用户有一个个人资料.
模型
类简介
views/profiles/new.html.erb
关于你
<div class="row"><div class="span6 offset3"><%= form_for(@profile) 做 |f|%><%= 渲染 'shared/error_messages' %><%= f.label :name %><%= f.text_field :name %><%= f.label :surname %><%= f.text_field :surname %><%= f.submit 创建我的账户",类别:btn btn-large btn-primary"%><%结束%>
控制器:Profiles_controller.rb我发现了两个错误,因为我不太明白为什么它不起作用.
class ProfilesController <应用控制器定义索引结尾高清秀结尾定义新# @user = User.find(params[:id]) # 错误信息:无法找到没有 ID 的用户# @profile = @user.build_profile()@profile = current_user.build_profile(params[:id]) # 错误信息:未知属性:user_id结尾定义编辑结尾定义创建结尾定义更新结尾销毁结尾结尾
Helpers:SessionHelper(说明current_user)模块会话助手定义登录(用户)cookies.permanent[:remember_token] = user.remember_tokenself.current_user = 用户结束
def signed_in?!current_user.nil?结尾def current_user=(用户)@current_user = 用户结尾def current_user?(用户)用户 == 当前用户结尾定义当前用户@current_user ||= User.find_by_remember_token(cookies[:remember_token])结尾定义退出self.current_user = nilcookies.delete(:remember_token)结尾def signed_in_user除非已登录?店面位置redirect_to signin_path,注意:请登录."结尾结尾结尾
您的配置文件表是否有 user_id 属性?
在您的路线中,个人资料应该是单一的,因为一个用户有一个个人资料:
资源:用户做资源:个人资料资源:进度图表资源 :calories_journals结尾
到用户配置文件的路由将是 users/:user_id/profile
(而不是 users/:user_id/profile/:id
在您的profiles_controller中:
@profile = current_user.build_profile(params[:id]) # 为什么是 params[:id]?#它应该只是@profile = current_user.build_profile()@user = User.find(params[:user_id])
表格类似于:
form_for [@user, @profile] do |f|...结尾
您真的希望用户像这样创建他的个人资料吗?通常,您会在用户注册时创建个人资料.
How to map out has_one model with nested routes and how to add a form_for for /localhost:3000/users/1/profile/new,html.erb following RESTful database?
User has one Profile.
Models
class Profile < ActiveRecord::Base
attr_accessible :name, :surname
belongs_to :user
end
class User < ActiveRecord::Base
attr_accessible :email, :email_confirmation, :password, :password_confirmation
has_secure_password
has_one :profile, dependent: :destroy
end
resources :users do
resources :profiles (note: has_one profile)
resources :progress_charts
resources :calories_journals
end
views/profiles/new.html.erb
<h1>About You</h1>
<div class="row">
<div class="span6 offset3">
<%= form_for(@profile) do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :surname %>
<%= f.text_field :surname %>
<%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
<% end %>
</div>
</div>
controller: Profiles_controller.rb Two errors I have discovered as I do not quite understand why it wasn't working.
class ProfilesController < ApplicationController
def index
end
def show
end
def new
# @user = User.find(params[:id]) # Error message: Couldn't find User without an ID
# @profile = @user.build_profile()
@profile = current_user.build_profile(params[:id]) # Error message: unknown attributes: user_id
end
def edit
end
def create
end
def update
end
def destroy
end
end
Helpers: SessionHelper (to illustrate current_user) module SessionsHelper def sign_in(user) cookies.permanent[:remember_token] = user.remember_token self.current_user = user end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user?(user)
user == current_user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
def signed_in_user
unless signed_in?
store_location
redirect_to signin_path, notice: "Please sign in."
end
end
end
Does your profiles table has a user_id attribute?
In your routes, profile should be singular, since a user has one profile:
resources :users do
resource :profile
resources :progress_charts
resources :calories_journals
end
The route to a user profile will be users/:user_id/profile
(and not users/:user_id/profile/:id
In your profiles_controller:
@profile = current_user.build_profile(params[:id]) # why params[:id]?
#it should just be
@profile = current_user.build_profile()
@user = User.find(params[:user_id])
And the form would be something like:
form_for [@user, @profile] do |f|...
end
Do you really want the user to create his profile like that? Usually, you would create the profile when a user register.
这篇关于嵌套路由和form_for 以及使用has_one 和belongs_to 的模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!