我是Ruby新手。我的控制器中有以下代码。 所需行为: - 我想在编辑页面上显示验证错误字符串到我的视图。所以我把这些错误放在一个变量中。当验证失败时,我想在我的编辑方法中使用该变量,以便我可以在我的编辑页面视图中显示该变量。
观察到的行为: - 创建方法中有一个变量 @vpinerr 。我想在编辑方法中使用该变量。我试图使用类变量(@@ vpinerr)并用空字符串初始化它(@@ vpinerr ="")然后在编辑方法中该变量的值变为空。
require 'rho/rhocontroller'
require 'helpers/browser_helper'
class LeadController < Rho::RhoController
include BrowserHelper
# GET /Lead
def index
@leads = Lead.find(:all)
render :back => '/app'
end
# GET /Lead/new
def new
@lead = Lead.new
render :action => :new, :back => url_for(:action => :index)
end
def create
# Update
if Lead.find(@params['id'])
@lead = Lead.find(@params['id'])
# array of objects
@leadadd = LeadAddress.find(:all,
:conditions => {:parentKey => @lead.object}
)
@leadcon = LeadContact.find(:all,
:conditions => {:parentKey => @lead.object}
)
#hash of hashes
leadaddressArray = @params['leadaddress']
arr1 = @leadadd.count - 1
for i in 0..arr1
j=i.to_s
@leadaddHash = @leadadd[i]
leadaddressHash = leadaddressArray[j]
if leadaddressHash['removed'] == "1"
singleadd = LeadAddress.find(:first,
:conditions => {:object => leadaddressHash['object']}
)
singleadd.destroy if singleadd
else
#validation
vpin = leadaddressHash['pincode']
#validation check
if vpin =~ /^[[:digit:]]+$/
@leadaddHash.update_attributes(leadaddressHash) if @leadaddHash
else
err = 1
@vpinerr = "Pincode is invalid"
end
end
end
leadconArray = @params['leadcontact']
arr2 = @leadcon.count - 1
for k in 0..arr2
z=k.to_s
@leadconHash = @leadcon[k]
leadContact = leadconArray[z]
if leadContact['removed'] == "1"
singlecon = LeadContact.find(:first,
:conditions => {:object => leadContact['object']}
)
singlecon.destroy if singlecon
else
@leadconHash.update_attributes(leadContact) if @leadconHash
end
end
@lead.update_attributes(@params['lead']) if @lead
if err == 0
redirect :action => :index
else
redirect :action => :edit, :id => @lead.object, :vpin =>@vpinerr
end
else
# Create
err = 0
# validation
vlead = @params['lead']
vfirstname = vlead['firstname']
vlastname = vlead['lastname']
vage = vlead['age']
#validation check
if (vfirstname =~ /^[[:alpha:][:blank:]]+$/) and (vlastname =~ /^[[:alpha:][:blank:]]+$/) and (vage =~ /^[[:digit:]]+$/)
@lead = Lead.create(@params['lead'])
@key = @lead.object
else
err = 1
@basicerr = "Basic Details are invalid"
end
if @params['leadaddress']
leadaddressArray = @params['leadaddress']
arrcount = leadaddressArray.count
for i in 1..arrcount
j=(i-1).to_s
leadaddressHash = leadaddressArray[j]
#validation
vpin = leadaddressHash['pincode']
#validation check
if vpin =~ /^[[:digit:]]+$/
@leadAdd = LeadAddress.create(leadaddressHash)
@leadAdd.parentKey = @key
@leadAdd.save()
else
err = 1
@vpinerr = "Pincode is invalid"
end
end
end
if @params['leadcontact']
leadconArray = @params['leadcontact']
arrcount2 = leadconArray.count
for k in 1..arrcount2
h=(k-1).to_s
leadconHash = leadconArray[h]
#validation
vhome = leadconHash['home']
vmobile = leadconHash['mobile']
vemail = leadconHash['email']
#validation check
if (vhome =~ /^[[:digit:]]+$/) and (vmobile =~ /^[[:digit:]]+$/) and (vemail =~ /\A([\w+\-]\.?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i)
@leadcontact = LeadContact.create(leadconHash)
@leadcontact.parentKey = @key
@leadcontact.save()
else
err = 1
@contacterr = "Contact Details are invalid"
end
end
end
if err == 0
redirect :action => :index
else
redirect :action => :edit, :id => @lead.object
end
end
end
# GET /Lead/{1}
def show
@lead = Lead.find(@params['id'])
@leadadd = LeadAddress.find(:all,
:conditions => {:parentKey => @lead.object}
)
@leadcontact = LeadContact.find(:all,
:conditions => {:parentKey => @lead.object}
)
if @lead
render :action => :show, :back => url_for(:action => :index)
else
redirect :action => :index
end
end
# GET /Lead/{1}/edit
def edit
@lead = Lead.find(@params['id'])
@leadaddress = LeadAddress.find(:all,
:conditions => {:parentKey => @lead.object}
)
@leadcontact = LeadContact.find(:all,
:conditions => {:parentKey => @lead.object}
)
@vpinerr2 = @vpinerr
if @lead
render :action => :new, :back => url_for(:action => :index)
else
redirect :action => :index
end
end
end
答案 0 :(得分:0)
带有前置@
的变量被视为实例变量,可在类的实例中使用。您的控制器是一个类,每个请求,Rails实例化一个新的控制器实例。从这个意义上讲,当您对create操作发出请求时,会创建一个新实例并在实例中设置@vpinerr
。将用户重定向到编辑操作时,会实例化新请求和新控制器实例。由于创建操作和编辑操作的实例不同,因此编辑操作中的值不会为@vpinerr
。
你有其他选择。
类级变量在类上设置,并且在所有实例中都可用。前缀为@@
的任何变量都是类变量。更改为@@vpinerr
,而不是@vpinerr
。
在你的情况下使用这是错误的,因为你可能希望它对每个用户都不同,但使用类变量将保留其他用户的值,直到它被改变。阅读类变量:http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby
会话变量用于保存会话中的变量。它们也可以在控制器之间共享。要设置会话变量session[:vpinerr] = "Some error"
并使用它,您可以简单地调用session[:vpinerr]
。