我知道这有点傻。
无论如何,我想实现一个测试优惠券系统。如果用户输入优惠券,数据库中该优惠券的相应金额将被添加到该特定用户的帐户。
我有我的优惠券控制器
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'
一切正常,手动喜欢网站/优惠券/兑换?code = test;这很好用。但是我想从用户那里获取输入并传递参数。
我如何以这样的方式安排有一个表格,用户可以输入优惠券代码并将其传递给优惠券#redeem?
感谢。
答案 0 :(得分:4)
为简单起见,只需添加
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
答案 1 :(得分:2)
这似乎很基本。
<% 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
答案 2 :(得分:1)
正确的方法是使用标准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) %>
-
如果您希望用户指定优惠券代码本身,您可以保留上述routes
和controller#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
就是......
在POST请求中,查询字符串(名称/值对)在HTTP消息正文中发送
在GET请求中,查询字符串(名称/值对)在URL
中发送