如何发送参数rails形式

How to send a parameter rails form

我知道这有点傻。 无论如何,我想实现一个测试优惠券 system.In,如果用户输入优惠券,数据库中该优惠券的相应金额将添加到该特定用户的帐户中。
我的优惠券控制器是

class CouponsController < ApplicationController
def redeem
    @coupon = Coupon.find_by_code(params[:code])
    if (@coupon.number_avail!=0)
      current_user.account = current_user.account + @coupon.amount
    else 
      flash[:notice] = "Coupon Invalid!"
      redirect_to root_path
    end
  end
end

我的路线文件为:

get '/coupon/redeem' => 'coupons#redeem'

手动操作一切正常喜欢site/coupon/redeem?code=test;这很好用。但是我想从用户那里获取输入并传递参数。

我如何安排一个表格,用户可以输入优惠券代码并将其传递给优惠券#redeem?

谢谢。

呃,这看起来很基础。

<% form_tag redeem_coupons_path do %>
  <label>Coupon <%= text_field_tag "code" %></label>
  <%= submit_tag "Submit" %>
<% end %>

请注意,此表单将使用 POST 请求,这是执行此操作的合适方法。你应该改变你的路线,让它期待 POST 而不是 GET。

编辑:另外,您的控制器代码需要考虑到找不到该代码的优惠券的可能性。我会把它改成这样:

def redeem
  if (@coupon = Coupon.find_by_code(params[:code])) && (@coupon.number_avail != 0)
    current_user.account = current_user.account + @coupon.amount
  else 
    flash[:notice] = "Coupon Invalid!"
    redirect_to root_path
  end
end

为了简单起见,只需添加一个

     redeem.html.erb   # in app/views/coupons
     #add this kind of code
      <form method="post" action="redeem" >
     <input type="text" value="" size="" name="coupon[yourchoice]" id="coupon_yourchoice">
        <%= button_to "submit" ,:action => "redeem" %>
      </form>

        #in your app/controller/coupon
           def redeem
             @variable = params
             puts @variable.inspect # to see the content
           end



    #for posting parameters to different url

     step :1  change the action of the form something like this,
     action="/yourchoice/abc"

         step :2  make changes in config/route.rb
       match '/yourchoice/abc', :to => 'yourcontroller#action', :via => [:get ,:post]

    step : 3  make an action in  yourcontroller
       def action
          @var = params
          p @var   #check the variable
       end

正确的方法是使用标准 resourceful routing:

#config/routes.rb
resources :coupons, only: [], param: :code do
   match :redeem, via: [:get, :post], on: :member #-> url.com/coupons/:code/redeem
end

#app/controllers/coupons_controller.rb
class CouponsController < ApplicationController
   def redeem
      @coupon = Coupon.find params[:code]
      if (@coupon.number_avail!=0)
         current_user.increment!(:account, @coupon.amount)
      else 
         redirect_to root_path, notice: "Coupon Invalid!"
      end
   end 
end

这将允许您使用:

<%= button_to @coupon.value, coupon_redeem_path(@coupon) %>

--

如果您希望用户自己指定优惠券代码,您可以像上面那样保留 routescontroller#action,但输入不同:

<%= form_for coupon_redeem_path do %>
   <%= text_field_tag :code %>
   <%= submit_tag %>
<% end %>

如果您不想透露 :coupon_id,您应该使用 POST 请求:

#config/routes.rb
resources :coupons, only: [], param: :code do
   post :redeem, on: :collection #-> url.com/coupons/redeem
end

difference between GET and POST 是...

In a POST request, the query string (name/value pairs) is sent in the HTTP message body

In a GET request, the query string (name/value pairs) is sent in the URL