使用用户输入查询MySQL数据库并移至下一页或显示错误

时间:2017-08-17 15:25:03

标签: mysql ruby-on-rails

访问我们网站的第一页时,系统会提示用户输入优惠券代码"继续下一页。优惠券可以多次使用,但必须存在于"代码" 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的部分内容,如果这有帮助的话。

2 个答案:

答案 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