Rails 3 中的关联将调查与用户关联

发布于 2025-01-05 15:40:55 字数 8175 浏览 0 评论 0原文

我正在使用 Rails 3.2.1、ruby 1..9.2、devise 1.5.3,我的应用程序是一个调查生成器...类似于 SurveyMonkey,我在关联方面遇到一些问题,因为我使用了 own_to 和 has_many 我的模型,我需要一项调查仅属于一个用户,但如果我以不同用户身份登录,我可以看到所有调查,我的应用程序不会将调查与用户关联...所有用户都可以查看所有调查,你能帮我解决这个问题吗?提前致谢,这是我的代码。

我的控制器:

类 AsurveysController <应用控制器
  # GET /调查
  # 获取/asurveys.json
  定义索引
    @asurveys = Asurvey.all

      respond_to do |格式|
      format.html #index.html.erb
      format.json { 渲染 json: @asurveys }
    结尾
  结尾

  # GET /asurveys/1
  # 获取/asurveys/1.json
  定义显示
    @asurvey = Asurvey.find(params[:id])

    respond_to do |格式|
      format.html # show.html.erb
      format.json { 渲染 json: @asurvey }
    结尾
  结尾

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

    #respond_to do |格式|
    # format.html # new.html.erb
    # format.json { 渲染 json: @asurvey }
    #结尾
 #结尾
  #ejemplo Railscast 第 3 条预防措施和 4 个答复
  定义新的  

  @asurvey = Asurvey.new  
  3.次  
    问题=@asurvey.questions.build  
    4.times { Question.answers.build }  
  结尾  
结尾
  #

  # GET /asurveys/1/edit
  默认编辑
    @asurvey = Asurvey.find(params[:id])
  结尾

  # POST /调查
  # POST /asurveys.json
  定义创建
    @asurvey = Asurvey.new(params[:asurvey])

    respond_to do |格式|
      如果@asurvey.save
        format.html {redirect_to @asurvey,注意:“Encuesta creada exitosamente。” }
        format.json { 渲染 json: @asurvey, status: :created, location: @asurvey }
      别的
        format.html { 渲染操作:“nueva” }
        format.json { 渲染 json: @asurvey.errors, status: :unprocessable_entity }
      结尾
    结尾
  结尾

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

    respond_to do |格式|
      if @asurvey.update_attributes(params[:asurvey])
        format.html {redirect_to @asurvey,注意:“Encuesta effectiveizada exitosamente。” }
        format.json { 头:好的 }
      别的
        format.html { 渲染操作:“editar” }
        format.json { 渲染 json: @asurvey.errors, status: :unprocessable_entity }
      结尾
    结尾
  结尾

  # 删除/asurveys/1
  # 删除/asurveys/1.json
  绝对摧毁
    @asurvey = Asurvey.find(params[:id])
    @asurvey.destroy

    respond_to do |格式|
      format.html {redirect_to asurveys_url }
      format.json { 头:好的 }
    结尾
  结尾
结尾

我的模型:

asurvey.rb

类Asurvey < ActiveRecord::基础
  属于:用户
  has_many:问题,:依赖 => :破坏
  #:依赖=> :destroy para que cuando eliminemos una encuesta se eliminen también todas sus preguntas.
  Accepts_nested_attributes_for:问题,:reject_if =>拉姆达{|a| a[:内容].空白? } , :allow_destroy =>真的   
  #accepts_nested_attributes_for para poder gestionar las preguntas a través de Survey。 Con esto podremos crear, 实现

预定义实际的属性。 #选择属性名称:_destroy。 Cuando tenga un valor true (cuando haya sido marcada), el registro 消除环境中的配方。 结束

问题.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

答案.rb

类答案< ActiveRecord::基础
  属于:问题 
结尾

用户.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

I' am working with rails 3.2.1, ruby 1..9.2, devise 1.5.3, my app is a survey builder...something like surveymonkey, I have some problems with the associations, because I used belongs_to and has_many im my models, I need that a survey belongs just to one user, but if I login as diferents users I can see all the surveys,my app don't associate a survey to a user...all the users can see all the surveys, can you help me with this issue?, thanks in advance, here is my code.

my controller:

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

my models:

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 caja de selección: _destroy. Cuando tenga un valor true (cuando haya sido marcada), el registro
será eliminado al enviar el formulario.
end

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青春如此纠结 2025-01-12 15:40:55

在您的 Asurveyscontroller 中替换

@asurveys = Asurvey.all

为以下内容:(

@asurveys = current_user.asurveys

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

在显示操作中,您可以执行以下操作:

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

这将确保即使另一个用户恶意发布不属于的 id根据他的调查,他不会看到它。

其他行动也需要类似的改变。

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

在这里全面解释如何处理登录有点困难。要测试代码,您可以添加一些内容,例如

current_user = User.find(1)

假设数据库中存在具有此 id 的用户。只需设置一个有效的用户对象,然后看看这是否像您希望的那样工作。

In your Asurveyscontroller replace

@asurveys = Asurvey.all

by something like:

@asurveys = current_user.asurveys

(that's assuming, that you can access the currently logged in user with current_user)

In the show action you can do:

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

This will ensure, that even if another user maliciously posts an id that doesn't belong to his surveys, he won't get to see it.

The other actions would need similar changes.

A lot would depend on how you handle your user login. I don't se any before_filters in you controller. You would need to add some more details here.

It would be a bit difficult to fully explain how to handle logins here. To test the code you could add something like

current_user = User.find(1)

assuming there is a user with this id in your database. Just set to a valid user object and then see, if this works like you want it to.

输什么也不输骨气 2025-01-12 15:40:55

您需要研究 Rails 嵌套资源。 此 Rails Cast 涉及该主题。您还可以参考 Rails 路由文档的本节

You need to look into Rails nested resources. This rails cast deals with the topic. You could also refer to this section of the Rails routing documentation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文