Rails 3 中的关联将调查与用户关联
我正在使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在您的 Asurveyscontroller 中替换
为以下内容:(
假设您可以使用 current_user 访问当前登录的用户)
在显示操作中,您可以执行以下操作:
这将确保即使另一个用户恶意发布不属于的 id根据他的调查,他不会看到它。
其他行动也需要类似的改变。
很大程度上取决于您如何处理用户登录。我在你的控制器中没有看到任何 before_filters 。您需要在此处添加更多详细信息。
在这里全面解释如何处理登录有点困难。要测试代码,您可以添加一些内容,例如
假设数据库中存在具有此 id 的用户。只需设置一个有效的用户对象,然后看看这是否像您希望的那样工作。
In your Asurveyscontroller replace
by something like:
(that's assuming, that you can access the currently logged in user with current_user)
In the show action you can do:
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
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.
您需要研究 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.