如何设置通过导轨控制器外键? [英] how to set foreign key through the controller in rails?

查看:158
本文介绍了如何设置通过导轨控制器外键?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有嵌套到用户形式的地址形式,但不能得到外键来填补。我见过人们使用隐藏字段建议,但是这似乎是从安全角度来看是一个坏主意。究竟如何设置使用控制器外键?现在我越来越地址用户不能为空的错误,当我试图提交

MVC

用户\\ new.html.erb

 < D​​IV>
    <%=的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆