Rails非RESTful困境?

时间:2011-08-04 19:23:49

标签: ruby-on-rails

我目前有一个非常简单的模型“优惠券”。我突然有兴趣再添加两个字段“redeem_code”和“redeemed”,原因很明显。

我想让商家根据代码兑换优惠券。

我能想到的最简单的方法就是这样:

  def redeem
    #renders the page
  end

  def redeem_post
    redeem_code = params[:redeem_code]
    deal = Deal.find_by_redeem_code(redeem_code)

    if deal.nil? 
      # BUG: Somehow here you will be logged out 
      redirect_to deals_path
    else 
      if deal.update_attribute(:redeemed, true)
        redirect_to deals_path
      end
    end
  end

就我而言,rails并不真正支持非restful接口。我昨晚尝试挖掘表格助手,但我找不到任何东西,所以我只是快速地把事情搞得一团糟:

<form action="<%= deals_redeem_post_path %>" method="post">

  <table>
    <tr>
      <th> Code: </th>
      <td> <input type="text" name="redeem_code" /> </td>
    </tr>
    <tr>
      <th></th>
      <td> <input type="submit" text="Submit" /> </td>
    </tr>
  </table>

</form>

我正在使用设计。我现在遇到的错误是当我的用户提交此表单时,他/她将自动注销。

我有什么想法可以解决这个问题或者更优雅地实现它?

1 个答案:

答案 0 :(得分:3)

我的猜测是你错过了自动生成的真实性令牌(这会阻止Cross Site Request Forgery (CSRF))。您希望使用帮助表单自动生成它。

<%= form_for(:coupon, :url => deals_redeem_post_path) do |f| %>

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for