如何发送参数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) %>
--
如果您希望用户自己指定优惠券代码,您可以像上面那样保留 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
是...
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
我知道这有点傻。
无论如何,我想实现一个测试优惠券 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) %>
--
如果您希望用户自己指定优惠券代码,您可以像上面那样保留 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
是...
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