访问我们网站的第一页时,系统会提示用户输入优惠券代码"继续下一页。优惠券可以多次使用,但必须存在于"代码" coupon_codes表的字段。
如果用户输入coupon_codes表中存在的代码,则应自动将其重定向到下一页。如果用户输入coupon_codes表中不存在的代码,则应显示错误,并选择再次尝试。
我确定我比这更困难,因为我已经开了很长时间。我已经能够让它成为我认为接近的东西,但并不完全在那里。有多种变化和试验,但这是我目前所处的位置。
模型(coupon_code):
def self.code(code)
if code
self.exists?(['code = ?', "#{code}"])
##move on to /design
else
##display error
end
end
查看(索引):
<%= form_tag coupon_code, :method => 'get' do %>
<%= text_field_tag :code, params[:code] %>
<%= submit_tag("Check my coupon", :name => nil) %>
<% end %>
控制器:
def index
@coupon_codes = CouponCode.code(params[:code])
end
在重新呈现我已经在的页面之前,日志显示以下内容(在输入正确的代码之后):
CouponCode Exists (0.2ms) SELECT 1 AS one FROM `coupon_codes` WHERE (code = 'correct') LIMIT 1
如果我使用rails控制台,它似乎应该可以工作(假设我正确使用它),我只是不确定如何让它继续前进或显示错误。
2.1.1 :001 > code = 'correct'
=> "correct"
2.1.1 :002 > CouponCode.exists?(['code = ?', "#{code}"])
CouponCode Exists (0.2ms) SELECT 1 AS one FROM `coupon_codes` WHERE (code = 'T001') LIMIT 1
D, [2017-08-17T11:08:32.730761 #6788] DEBUG -- : CouponCode Exists (0.2ms) SELECT 1 AS one FROM `coupon_codes` WHERE (code = 'correct') LIMIT 1
=> true
2.1.1 :003 > code = 'wrong'
=> "wrong"
2.1.1 :004 > CouponCode.exists?(['code = ?', "#{code}"])
CouponCode Exists (0.2ms) SELECT 1 AS one FROM `coupon_codes` WHERE (code = 'wjorea') LIMIT 1
D, [2017-08-17T11:09:10.611964 #6788] DEBUG -- : CouponCode Exists (0.2ms) SELECT 1 AS one FROM `coupon_codes` WHERE (code = 'wrong') LIMIT 1
=> false
同样,我确信这很简单,我只是在考虑它。对不起,如果我给了太多细节......我认为太多比不够好。提前感谢您的任何帮助或指导!
我目前的代码是基于this Stack Overflow question的部分内容,如果这有帮助的话。
答案 0 :(得分:0)
这里的问题是模型不是也不应该关注控制器或视图问题。重定向到另一个页面显然是一个控制器问题,必须直接在控制器中处理。
您要做的是将模型的代码减少到咨询位置,它将建议控制器如何处理请求。它不会采取直接行动。
例如:
class CouponCode
def self.code_exists?(code)
self.exists?(code: code)
end
end
然后在控制器中:
if (Coupon.code_exists?(params[:code]))
redirect_to(coupon_exists_path(...))
end
考虑到你的支票有多简单,不清楚模型中是否有这样的方法是有用的,因为替代方案很简单:
if (Coupon.exists?(code: params[:code]))
redirect_to(coupon_exists_path(...))
end
控制器上的代码多一个字符,模型上的代码少三行。
答案 1 :(得分:0)
我只是不确定如何让它继续前进或显示 错误。
您需要将该代码放在控制器中。它是控制器处理此类事情的工作。此外,您不需要模型方法。为了使事情简单明了,请尝试以下
def index
if CouponCode.exists?(code: params[:code])
#code for redirect to next page
else
flash.now[:notice] = "Your error message"
end
end