2010年9月23日 星期四

Ruby on Rail - 拿到POST Method參數值

POST method最常用的就是Form了
延續上一篇的設定
我們要新增一個File 在 app/views/echo_test 叫 form.rhtml
為什麼用rhtml就是因為裡面會有RoR預設的tag
========================
<% form_tag( { :action => "postData", }, { :method => :post }) do %>

  First name : <%= text_field "person", "first", "size" => 20 %> <br>
  Second name : <%= text_field "person", "second", "size" => 20 %> <br>
  <%= submit_tag( "send" ) %>

<% end %>
========================
在<% %> 裡面的就是RoR用的,已經和HTML綁在一起了
我們從頭開始看一下
<% form_tag( { :action => "postData", }, { :method => :post }) do %>
 ...
<% end %>

就是相對於HTML的
<form action="postData" method="post">
</form>
接下來
<%= text_field "person", "first", "size" => 20 %>
<%= text_field "person", "second", "size" => 20 %>
的意思是
這個text field 被傳出去的時候會用
{"person"=>{"second"=>"Pan", "first"=>"Michael"}}

我們在rb的file裡要接參數值就要這樣寫
params[:person] 這樣是接到 {"second"=>"Pan", "first"=>"Michael"}
params[:person]["first"] 這樣是接到 Michael
所以我們修改echo_test_controller 成
============================
class EchoTestController < ApplicationController
    def index
       render :file => 'app/views/echo_test/form.rhtml'
    end
    def postData
       render :text => 'Hello ' + params[:person]["first"]
    end

end
===========================
一連進http:127.0.0.1/getTest 就會先去讀 index這個method
因為這行 render :file => 'app/views/echo_test/form.rhtml'
會開始讀取form.rhtml
然後按下send之後form.rhtml會因為action => 'postData'
再回到echo_test_controller的 postData這個method
然後網頁就render出
render :text => 'Hello ' + params[:person]["first"]

Hello Michael

最後要提醒大家,如果Form不是用RoR的tag產生的
比如說是用NSURLRequest或是其他程式連的
那麼就很有可能會產生以下的錯誤
ActionController::InvalidAuthenticityToken
此時要在Class一開始就貼上
skip_before_filter :verify_authenticity_token

============================
class EchoTestController < ApplicationController
   skip_before_filter :verify_authenticity_token
    def index
       render :file => 'app/views/echo_test/form.rhtml'
    end
    def postData
       render :text => 'Hello ' + params[:person]["first"]
    end

end
===========================
請參考:http://goo.gl/yrmS

沒有留言:

張貼留言