【问题标题】:association in rails 3 associate 1 survey to 1 userrails 3 中的关联将 1 个调查关联到 1 个用户
【发布时间】:2012-03-18 23:11:36
【问题描述】:

我正在使用 ruby​​ 1.9.2、rails 3.1.3、devise 1.5.3、mysql,我的应用程序是关于调查的,现在所有用户都可以看到所有调查,但我需要 user1 只能看到由user1,现在user1和user2等可以看到所有的调查,认证模块是用设计完成的,通过登录识别每个用户,在我的数据库中我把user_id作为外键,或者只是通过alter table tablename add column user_id int(11 )不为空;但是当我尝试创建一个新调查时,我收到以下消息:Mysql2::Error: Column 'user_id' cannot be null: INSERT INTO asurveys (created_at, name, updated_at, @987654325 @) VALUES ('2012-02-29 12:39:34', 'encuesta music', '2012-02-29 12:39:34', NULL) *我的控制器:*

asurveys_controller.rb

类 AsurveysController

定义索引 @asurveys = current_user.asurveys respond_to 做 |格式| format.html # index.html.erb format.json { 渲染 json: @asurveys } 结束结束

@asurvey = Asurvey.find(params[:id])
#@asurvey = current_user.asurveys.find(params[:id])
#current_user.asurveys = User.find(1)
respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @asurvey }
end   end

# GET /asurveys/new # GET /asurveys/new.json #def new #@asurvey = Assurvey.new #3.times { @asurvey.questions.build }

#respond_to do |format|
#  format.html # new.html.erb
#  format.json { render json: @asurvey }
#end  #end   #ejemplo railscast para 3 preguntas y 4 respuestas   def new  
      @asurvey = Asurvey.new  

3.times
问题 = @asurvey.questions.build
4.times { question.answers.build } end end # # GET /asurveys/1/edit def 编辑 @asurvey = Asurvey.find(params[:id]) 结束

# POST /asurveys # POST /asurveys.json def create @asurvey = Asurvey.new(params[:asurvey])

respond_to do |format|
  if @asurvey.save
    format.html { redirect_to @asurvey, notice: 'Encuesta creada exitosamente.' }
    format.json { render json: @asurvey, status: :created, location: @asurvey }
  else
    format.html { render action: "nueva" }
    format.json { render json: @asurvey.errors, status: :unprocessable_entity }
  end
end   end

# PUT /asurveys/1 # PUT /asurveys/1.json def 更新 @asurvey = Asurvey.find(params[:id])

respond_to do |format|
  if @asurvey.update_attributes(params[:asurvey])
    format.html { redirect_to @asurvey, notice: 'Encuesta actualizada exitosamente.' }
    format.json { head :ok }
  else
    format.html { render action: "editar" }
    format.json { render json: @asurvey.errors, status: :unprocessable_entity }
  end
end   end

# DELETE /asurveys/1 # DELETE /asurveys/1.json def destroy @asurvey = Asurvey.find(params[:id]) @asurvey.destroy

respond_to do |format|
  format.html { redirect_to asurveys_url }
  format.json { head :ok }
end   end end

application_controller.rb

类 ApplicationController 防止伪造

def after_sign_in_path_for(resource) stored_location_for(resource) || bienvenido_path end end

我的模型

    class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  #codigo de asociacion, un usuario puede tener muchas encuestas, esta asociacio se hace para que 1 usuario pueda
  #tener muchas encuestas, pero cada encuesta solo tiene 1 usuario

  #codigo de prueba para asociar encuestas a un solo usuario
  #has_many :asurveys
  has_many :asurveys
  #, :foreign_key => :user_id, :class_name => 'User'
  #fin asociacion

  devise :database_authenticatable, :registerable,:confirmable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me,
                  :tipo_tarjeta, :numero_tarjeta, :fecha_vencimiento, :nombre_en_tarjeta,
                  :cvv, :nombre, :apellidos, :mail_facturacion, :mail_facturacion_alternativo,
                  :nombre_empresa, :pais, :direccion,:codigo_postal, :telefono, :numero_orden_compra 

                  #validacion de presencia de campos, no pueden estar en blanco
  #validacion de presencia de campos, no pueden estar en blanco
  validates_presence_of :numero_tarjeta,
  :message => ": ingrese numero de tarjeta (15 digitos)"
  validates_presence_of  :nombre_en_tarjeta,
  :message => ": ingrese el nombre que aparece en su tarjeta"
  #validates_presence_of  :fecha_vencimiento,
  #:message => ": ingrese fecha de vencimiento de su tarjeta"
  validates_presence_of  :cvv,
  :message => ": ingrese cvv "
  #validacion de ingreso de campos "datos personales"
  validates_presence_of :nombre, 
  :message => ": ingrese su nombre"
  validates_presence_of :apellidos,
  :message => ": ingrese sus apellidos"
  validates_presence_of :mail_facturacion,
  :message => ": ingrese mail de facturacion"
  validates_presence_of :mail_facturacion_alternativo,
  :message => ": ingrese mail alternativo de facturacion"
  validates_presence_of :nombre_empresa,
  :message => ": ingrese nombre de su empresa"
  validates_presence_of :direccion,
  :message => ": ingrese direccion de su empresa"
   validates_presence_of :codigo_postal,
  :message => ": ingrese codigo postal"
  validates_presence_of :telefono,
  :message => ": ingrese telefono de su empresa"
  validates_presence_of :numero_orden_compra,
  :message => ": ingrese numero de orden de compra"
  #largo de campos, formato mail
  validates_length_of :numero_tarjeta, :minimum => 16, :allow_blank => true, :message => "El numero debe tener al menos 16

经度数字"
validates_length_of :nombre_en_tarjeta, :minimum => 2, :allow_blank => true, :message => "minimo 2 caracteres"
validates_length_of :cvv, :in => 3..4, :allow_blank => true, :message => "(en Mastercard y Visa son los 3 ultimos digitos impresos al dorso de la tarjeta, en American Express son los 4 numeros impresos en el frente de la tarjeta arriba de los ultimos digitos grabados en 缓解)” validates_length_of :nombre, :minimum => 2, :allow_blank => true, :message => "minimo 2 caracteres" validates_length_of :apellidos, :minimum => 4, :allow_blank => true, :message => "minimo 4 caracteres" validates_format_of :mail_facturacion, :with => /^[A-Z0-9._%-]+@([A-Z0-9]+.)+[AZ]{2,4}$/i, :message => "格式不正确" validates_format_of :mail_facturacion_alternativo, :with => /^[A-Z0-9._%-]+@([A-Z0-9]+.)+[AZ]{2,4}$/i, :message => "格式不正确邮件替代" validates_length_of :nombre_empresa, :minimum => 4, :allow_blank => true, :message => "minimo 4 caracteres" validates_length_of :direccion, :minimum => 4, :allow_blank => true, :message => "minimo 4 caracteres"
validates_length_of :codigo_postal, :minimum => 7, :allow_blank => true, :message => "minimo 7 caracteres" validates_length_of :telefono, :minimum => 7, :allow_blank => true, :message => "minimo 7 caracteres" validates_length_of :numero_orden_compra, :minimum => 2, :allow_blank => true, :message => "minimo 2 caracteres"

  #validates_length_of :password, :minimum => 6, :allow_blank => false                     

> 结束

类调查

belongs_to :user #belongs_to :user #belongs_to :user, :class_name => "User", :foreign_key => 'user_id' belongs_to :user #, :foreign_key => "user_id" #attr_accessible :user_id #has_many H1>

:asurveys_users #has_many :users, :through => :asurveys_users

has_many :asurveys_users, :class_name => "User", :through => :asurveys_users #fin asociacion, una encuesta pertenece an solo un

usuario has_many :questions, :dependent => :destroy #:dependent => :destroy para que cuando eliminemos una encuesta se eliminen también todas sus preguntas。 accept_nested_attributes_for :问题, :reject_if => lambda { |a| a[:content].空白? } , :allow_destroy => true #accepts_nested_attributes_for para poder gestionar las preguntas a través de Survey。 Con esto podremos crear,actualizar y detruir preguntas cuando actualicemos los atributos de una encuesta。

el nombre de atributo para la caja de selección: _destroy。 Cuando tenga un valor true (cuando haya sido marcada), el registro será

eliminado al enviar el formulario。 #User.find(1).asurveys 结束

浏览量

Encuesta

名词:




| 'Estas seguro/a?', :method => :delete %> |

asurvey_helper

模块AsurveysHelper结束

【问题讨论】:

  • if 代码很多。请将其粘贴到 [此处][1],这样可以更轻松地查看和查看您的代码。如果您粘贴db/schema.rb 文件也将是完美的。谢谢

标签: mysql ruby-on-rails associations


【解决方案1】:

要创建新调查,您应该执行以下操作:

current_user.asurveys.create(params[:assurvey])

要获取仅由登录用户创建的调查:

@asurveys = current_user.asurveys

【讨论】:

  • 谢谢!但是...我需要一个 current_user 助手?什么是语法?
  • 您不需要 create current_user 方法。 current_user 辅助方法由 Devise gem 自动创建。
  • 好的,谢谢...但是...不工作!当然我做错了什么......请帮助!还有什么其他代码可以帮助???
  • 好的,我们开始吧:在 mysql alter table asurveys 添加外键 (user_id) 引用 users(id);
【解决方案2】:

在“@asurvey = Asurvey.new(params[:asurvey])”之后,你需要在保存@asurvey之前设置用户,比如:

@asurvey = Asurvey.new(params[:asurvey])
@asurvey.user = current_user

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多