2009-04-26 46 views
1

我希望能夠給代碼潛在用戶在電子郵件中的鏈接的形式(例如mysite.com/signup?beta=rapunzel)RoR:如何創建「有效註冊碼」查找?

當有人點擊的鏈接,它填充帶有值hidden_​​field(將只使用:params [:beta]的工作?)

然後,在它創建用戶之前,它通過檢查另一個表,我有不同的測試代碼驗證。

然後繼續並存儲哪些代碼或可能只是beta.id.

對此提出建議?一個插件已經存在?

謝謝。

回答

1

當用戶點擊mysite.com/signup時,與該路線相關聯的操作將具有存儲在params [:beta]中的值「rapunzel」。您可以將它分配給實例變量(@beta),將其傳遞給您的用戶控制器,並按照計劃通過您的隱藏字段傳遞給您的用戶控制器,並在保存用戶對象之前將其與您的表進行比較。

或者你可以只允許你的用戶去註冊頁面在所有的,如果他們正在傳遞一個有效的測試代碼,在這種情況下,你不需要任何特殊的表單字段:

def signup 
    unless BetaCode.find_by_code(params[:beta]) 
    flash[:notice] = "You can't sign up without a beta code!" 
    redirect_to root_path 
    end 
end 
+0

啊,所以模型是BetaCode,它有幾行不同值的beta(例如BetaCode.id和BetaCode。測試版)和「除非」條款將檢查所有值,如果它沒有找到它,這將是一個無效的註冊頁面? – Angela 2009-04-27 01:03:09

+0

沒錯。除非與「if!子句」相同。這是Ruby的漂亮但混亂的成語之一,許多人不會因爲這個原因而使用它 - 這是一種個人風格的東西。 :) 而且,是的,這就是我如何從原始問題的描述中設想出BetaCode:包含有效的測試代碼的條目表,其中包含行「id」和「code」。當然,你是如何做到的,取決於你,Daemin的建議是非常好的。 – Raphomet 2009-04-27 01:24:55

1

您從URL中獲取的參數取決於您的路由設置方式。根據您目前的路線,你會得到:

params[:beta] = "rapunzel" 

如果您指定的路線爲:

map.connect '/signup/:beta', :controller => 'signup', :action => 'beta' 

,你可以把他們像一個鏈接:mysite.com/signup/rapunzel代替,你會得到beta參數與之前相同。

要將beta字段放到表單上,只需將其作爲表單頁面模板上的隱藏字段包含即可。

在控制器放像:

@beta_id = params[:beta] 

然後在視圖模板放:

hidden_field_tag 'beta', @beta_id 

然後,當他們註冊和創建你可能會想在掛鉤一個正確的ID從用戶表中的行與包含「測試版」表中的測試版標識的行進行關聯。如果您只想讓單個用戶註冊每個測試版標識,那麼這可能是測試版表上的has_one關聯;如果多個人都可以註冊,則可能是has_many。

+0

嗨,好吧,很酷......我想has_many協會是我正在尋找的......所以我應該創建一個beta測試版beta.id作爲一列和beta.beta作爲其他(?)我創建一個驗證來執行檢查,或者如何檢查它是否有效? – Angela 2009-04-27 01:01:45

1

我會這樣做的驗證。

class User < ActiveRecord::Base 
    validate_on_create {|r| 
    beta_code = BetaCode.find_by_code(r.beta_code) 

    beta_code && beta_code.destroy || 
     r.errors.add(beta_code, "is invalid") 
    } 

    attr_accessor :beta_code 
end 

在您的形式:

<% form_for(@user) do |f| %> 
    # fields... 
    <%= f.text_field :beta_code %> 
<% end %> 

這假定您有其表包含的測試代碼列表的BetaCode模型。