【问题标题】:Using user input to query MySQL database and move to next page or display error使用用户输入查询 MySQL 数据库并移动到下一页或显示错误
【发布时间】:2017-08-17 15:25:02
【问题描述】:

当访问我们网站的第一页时,系统会提示用户输入“优惠券代码”以继续到下一页。优惠券可以多次使用,但必须存在于 coupon_codes 表的“code”字段中。

如果用户输入的代码存在于 coupon_codes 表中,他们应该会自动被重定向到下一页。如果用户输入的代码在 coupon_codes 表中不存在,则应显示错误并提供重试选项。

我确信我让这件事变得比需要的更困难,因为我已经断断续续地工作了好几天。我已经能够让它成为我觉得很接近的东西,但并不完全在那里。有多种变化和试验,但这是我目前所处的位置。

型号(优惠券代码):

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 的部分内容,如果有帮助的话。

【问题讨论】:

  • 请注意,在 ActiveRecord 中,大多数情况下您可以将 ['x=?', x] 替换为更简洁的 { x: x }
  • 很高兴知道!谢谢你,@tadman!

标签: mysql ruby-on-rails


【解决方案1】:

这里的问题是模型不是也不应该关心控制器或视图问题。重定向到另一个页面是明确的控制器问题,必须直接在控制器中处理。

您想要做的是将模型的代码减少到咨询位置,它将建议控制器如何处理请求。它不会采取直接行动。

例如:

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

控制器上的代码多了一个字符,模型上的代码少了三行。

【讨论】:

  • 啊哈!你说的完全有道理。谢谢!我曾尝试从该方法调用控制器,以便我可以告诉它重定向到下一页,但后来读到那是不行的,这也是有道理的。您建议的代码也适用于继续,我只需要显示一条错误消息(希望没有重新加载页面)。
  • 如果您使用return redirect_to,那么这将阻止您的控制器中发生任何其他事情,这意味着如果您将代码放在if 块之后,您可以做任何您需要的事情,包括设置@987654326 @ 管他呢。请记住,默认操作是使用控制器操作的名称渲染模板,所以让它这样做。
【解决方案2】:

我只是不确定如何让它继续前进或显示 错误。

您需要将该代码放入控制器。处理此类事情是控制器的工作。你也不需要这里的模型方法。为了让事情变得简单明了,请尝试以下操作

def index 
  if CouponCode.exists?(code: params[:code])
    #code for redirect to next page
  else
    flash.now[:notice] = "Your error message"
  end
end

【讨论】:

  • 我在其他一次尝试中非常接近这一点,但我没有与它建立联系。 (我在控制器中使用了不同的“检查优惠券”方法。不过好消息......这对于输入正确代码的情况非常有用,但错误消息没有显示在我能看到的任何地方(包括日志)。我需要在视图中引用它吗?页面没有显示,而是重新加载,并在 url 中显示不正确的优惠券代码。
猜你喜欢
  • 2021-02-21
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2014-08-16
  • 1970-01-01
相关资源
最近更新 更多