如何设置通过导轨控制器外键? [英] how to set foreign key through the controller in rails?
本文介绍了如何设置通过导轨控制器外键?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有嵌套到用户形式的地址形式,但不能得到外键来填补。我见过人们使用隐藏字段建议,但是这似乎是从安全角度来看是一个坏主意。究竟如何设置使用控制器外键?现在我越来越地址用户不能为空的错误,当我试图提交
在
MVC用户\\ new.html.erb
< DIV>
<%=的form_for(@user)做| F | %GT;
<%=渲染的共享/ error_messages'%GT; <%= f.label:排名%GT;
<%= f.text_field:排名%GT; <%= f.label:名字,名%GT;
<%= f.text_field:名字%GT; <%= f.label:名字,姓%GT;
<%= f.text_field:名字%GT; <%= f.label:middleInitial,中间名%>
&所述;%= f.text_field:middleInitial%GT; <%= fields_for:地址做| A | %GT; <%= a.label:地址%>
<%= a.text_field:地址%> <%= a.label:全市%GT;
<%= a.text_field:全市%GT; <%= a.label:状态%GT;
<%= a.text_field:状态%GT; <%= a.label:拉链,邮编code%GT;
<%= a.text_field:拉链%GT;
<%结束%GT; <%= f.label:电子邮件%GT;
<%= f.text_field:电子邮件%GT; <%= f.label:DATEOFBIRTH,出生日期%GT;
<%= f.text_field:DATEOFBIRTH%GT; <%= f.label:MOS,MOS%GT;
<%= f.text_field:MOS%GT; <%= f.label:ets_pcsDate,ETS / PCS日%GT;
&所述;%= f.text_field:ets_pcsDate%GT; <%= f.label:PHONENUM,电话号码%>
&所述;%= f.text_field:PHONENUM%GT; <%= f.label:密码%GT;
<%= f.text_field:密码%GT; <%= f.label:password_confirmation,确认%GT;
&所述;%= f.text_field:password_confirmation%GT; <%= f.submit注册%GT;
<%结束%GT;
< / DIV>< H1>#用户新< / H1>
< P>发现我的应用程序/视图/用户/ new.html.erb< / P>
模式
用户
类用户< ActiveRecord的::基地
attr_accessible:MOS,:DATEOFBIRTH,:ets_pcsDate,:名字,
:名字,:middleInitial,:PHONENUM,:等级,:电子邮件,:密码,
:确认密码 has_secure_password
HAS_ONE:地址,取决于:摧毁 accepts_nested_attributes_for:地址
before_save {|用户| user.email = email.downcase}
before_save:create_remember_token 验证:秩,presence:真
验证:名字,presence:真的,长度:{最大值:15}
验证:名字,presence:真的,长度:{最大值:20}
验证:middleInitial,presence:真的,长度:{最大值:1} VALID_EMAIL_REGEX = /\\A[\\w+\\-.]+@[a-z\\d\\-.]+\\.[a-z]+\\z/i
验证:电子邮件,presence:真实,
格式:{搭配:VALID_EMAIL_REGEX},
独特性:{CASE_SENSITIVE:假} 验证:DATEOFBIRTH,presence:真
验证:MOS,presence:真
验证:ets_pcsDate,presence:真
验证:PHONENUM,presence:真
验证:密码,长度:{最低:6}
验证:password_confirmation,presence:真
私人的 高清create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
结束
结束
地址
类地址< ActiveRecord的::基地
attr_accessible:地址:城市:状态:ZIPbelongs_to的:用户验证:地址,presence:真
验证:城市,presence:真
验证:状态,presence:真
验证:拉链,presence:真
验证:USER_ID,presence:真
结束
控制器
类UsersController< ApplicationController中
的before_filter:signed_in_user,只有:[:索引:编辑:更新:秀:destory]
的before_filter:correct_user,只有:[:编辑:更新]
的before_filter:管理员用户名,只:摧毁 高清新
@user = User.new
@ user.address.build
结束 打造高清
@user = User.new(PARAMS [:用户])
@address = @ user.build_address(PARAMS [:地址])
如果@ user.save
sign_in @user
闪光[:成功=欢迎到B五哥!
redirect_to的@user
其他
使新
结束
结束 高清节目
@user = User.find(PARAMS [:ID])
结束 高清指数
@users = User.paginate(页:PARAMS [:页面])
结束 高清编辑
结束 DEF更新
如果@ user.update_attributes(PARAMS [:用户])
闪光[:成功=配置文件更新
sign_in @user
redirect_to的@user
其他
渲染编辑
结束
结束 DEF破坏
User.find(PARAMS [:ID])破坏。
闪光[:成功=用户删除
redirect_to的users_path
结束 私人的
高清signed_in_user
除非signed_in?
store_location
redirect_to的root_path,告示:请登录。
结束
结束 高清correct_user
@user = User.find(PARAMS [:ID])
redirect_to时(root_path)除非CURRENT_USER?(@用户)
结束 高清管理员用户名
redirect_to时(root_path),除非current_user.admin?
结束
结束
解决方案
删除USER_ID验证并获得成功。
I've got an address form nested into a user form but cant get the foreign key to fill. I've seen people suggest using a hidden field, but that seems to be a bad idea from a security standpoint. How exactly do you set the foreign key using the controller? Right now I'm getting Address user can't be blank error when I try to submit
MVC below
user\new.html.erb
<div>
<%= form_for(@user) do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label :rank %>
<%= f.text_field :rank %>
<%= f.label :firstName, "First Name" %>
<%= f.text_field :firstName %>
<%= f.label :lastName, "Last Name" %>
<%= f.text_field :lastName %>
<%= f.label :middleInitial, "Middle Initial" %>
<%= f.text_field :middleInitial %>
<%= fields_for :address do |a| %>
<%= a.label :address %>
<%= a.text_field :address %>
<%= a.label :city %>
<%= a.text_field :city %>
<%= a.label :state %>
<%= a.text_field :state %>
<%= a.label :zip, "Zip Code" %>
<%= a.text_field :zip %>
<% end %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :dateOfBirth, "Date of Birth" %>
<%= f.text_field :dateOfBirth %>
<%= f.label :MOS, "MOS" %>
<%= f.text_field :MOS %>
<%= f.label :ets_pcsDate, "ETS/PCS Date" %>
<%= f.text_field :ets_pcsDate %>
<%= f.label :phoneNum, "Phone Number" %>
<%= f.text_field :phoneNum %>
<%= f.label :password %>
<%= f.text_field :password %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.text_field :password_confirmation %>
<%= f.submit "Sign up" %>
<% end %>
</div>
<h1>Users#new</h1>
<p>Find me in app/views/users/new.html.erb</p>
Models
User
class User < ActiveRecord::Base
attr_accessible :MOS, :dateOfBirth, :ets_pcsDate, :firstName,
:lastName, :middleInitial, :phoneNum, :rank, :email, :password,
:password_confirmation
has_secure_password
has_one :address, dependent: :destroy
accepts_nested_attributes_for :address
before_save { |user| user.email = email.downcase }
before_save :create_remember_token
validates :rank, presence: true
validates :firstName, presence: true, length: { maximum: 15 }
validates :lastName, presence: true, length: { maximum: 20 }
validates :middleInitial, presence: true, length: { maximum: 1 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
validates :dateOfBirth, presence: true
validates :MOS, presence: true
validates :ets_pcsDate, presence: true
validates :phoneNum, presence: true
validates :password, length: { minimum: 6 }
validates :password_confirmation, presence: true
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
Address
class Address < ActiveRecord::Base
attr_accessible :address, :city, :state, :zip
belongs_to :user
validates :address, presence: :true
validates :city, presence: :true
validates :state, presence: :true
validates :zip, presence: true
validates :user_id, presence: true
end
Controller
class UsersController < ApplicationController
before_filter :signed_in_user, only: [:index, :edit, :update, :show, :destory]
before_filter :correct_user, only:[:edit, :update]
before_filter :admin_user, only: :destroy
def new
@user = User.new
@user.address.build
end
def create
@user = User.new(params[:user])
@address = @user.build_address(params[:address])
if @user.save
sign_in @user
flash[:success] = "Welcome to B Troop!"
redirect_to @user
else
render 'new'
end
end
def show
@user = User.find(params[:id])
end
def index
@users = User.paginate(page: params[:page])
end
def edit
end
def update
if @user.update_attributes(params[:user])
flash[:success] = "Profile updated"
sign_in @user
redirect_to @user
else
render 'edit'
end
end
def destroy
User.find(params[:id]).destroy
flash[:success] = "User removed"
redirect_to users_path
end
private
def signed_in_user
unless signed_in?
store_location
redirect_to root_path, notice: "Please sign in."
end
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_path) unless current_user?(@user)
end
def admin_user
redirect_to(root_path) unless current_user.admin?
end
end
解决方案
Removing the user_id validation did the trick.
这篇关于如何设置通过导轨控制器外键?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文