rails 3中的关联将调查与用户相关联

时间:2012-02-15 13:47:17

标签: ruby-on-rails associations belongs-to

我正在使用rails 3.2.1,ruby 1..9.2,设计1.5.3,我的应用程序是一个调查构建器...类似surveymonkey,我有一些关联的问题,因为我使用了belongs_to和has_many我的模型,我需要一个调查只属于一个用户,但如果我以不同的用户身份登录我可以看到所有调查,我的应用程序不会将调查与用户关联...所有用户都可以看到所有调查,你能帮我解决这个问题吗?,提前谢谢,这是我的代码。

我的控制器:

class AsurveysController < ApplicationController
  # GET /asurveys
  # GET /asurveys.json
  def index
    @asurveys = Asurvey.all

      respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @asurveys }
    end
  end

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

    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 = Asurvey.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 do  
    question = @asurvey.questions.build  
    4.times { question.answers.build }  
  end  
end
  #

  # GET /asurveys/1/edit
  def edit
    @asurvey = Asurvey.find(params[:id])
  end

  # 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 update
    @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

我的模特:

asurvey.rb

class Asurvey < ActiveRecord::Base
  belongs_to :user
  has_many :questions, :dependent => :destroy
  #:dependent => :destroy para que cuando eliminemos una encuesta se eliminen también todas sus preguntas.
  accepts_nested_attributes_for :questions, :reject_if => lambda { |a| a[:content].blank? } , :allow_destroy => true   
  #accepts_nested_attributes_for para poder gestionar las preguntas a través de Survey. Con esto podremos crear, actualizar y
     

destruir preguntas cuando actualicemos los atributos de una encuesta。         #el nombre de atributo para la cajadeselección:_destroy。 Cuando tenga un valor true(cuando haya sido marcada),el registro   seráinodadoal enviar el formulario。       端

question.rb

> class Question < ActiveRecord::Base   #survey_id para relacionarlo con
> la encuesta y un campo de contenido para albergar el texto de la
> pregunta.
>      has_many :answers, :dependent => :destroy     accepts_nested_attributes_for :answers, :reject_if => lambda { |a|
> a[:content].blank? }, :allow_destroy => true      end

answer.rb

class Answer < ActiveRecord::Base
  belongs_to :question 
end

user.rb

>     class User < ActiveRecord::Base
>       # Include default devise modules. Others available are:
>       # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
>       
>       has_many :asurveyse
>       
>       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
> digitos de longitud"  
>       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
> relieve)" 
>       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]+\.)+[A-Z]{2,4}$/i, :message => "formato incorrecto"
>       validates_format_of :mail_facturacion_alternativo,
>       :with => /^[A-Z0-9._%-]+@([A-Z0-9]+\.)+[A-Z]{2,4}$/i, :message => "formato incorrecto en mail alternativo"
>       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                     
>                       
>     end

2 个答案:

答案 0 :(得分:1)

在你的Asurveyscontroller中替换

@asurveys = Asurvey.all

通过以下方式:

@asurveys = current_user.asurveys

(假设您可以使用current_user访问当前登录的用户)

在show动作中你可以这样做:

@asurvey = current_user.asurveys.find(params[:id])

这将确保即使其他用户恶意发布不属于他的调查的ID,他也不会看到它。

其他行动需要进行类似的修改。

很多将取决于您如何处理您的用户登录。我在你的控制器中没有任何before_filters。您需要在此处添加更多详细信息。

在这里完全解释如何处理登录将会有点困难。要测试代码,您可以添加类似

的内容
current_user = User.find(1)

假设您的数据库中有一个具有此ID的用户。只需设置为有效的用户对象,然后看看,如果它的工作方式与您想要的一样。

答案 1 :(得分:0)

您需要查看Rails嵌套资源。 This rails cast处理该主题。您还可以参考Rails路由文档的this section