about 2 years ago

參考:Rails 3: Multiple Select with has_many through associations

參考:Rails form with multiple nested models causes issues with radio groups

參考:after create and after save
--after_create:第一次create時才會啟動。 after_save:每次存檔的時候都會啟動

參考:Ruby on Rails - Creating a profile when user is created

  1. 登入以後,要先回答三個問題。
  2. 現在因為沒有發出註冊信,所以可以設在註冊之後。不過,以後應該會增加註冊信,所以還是在登入後再回答三個準備題比較好。
  3. 註冊之後的畫面:How To: Redirect to a specific page on successful sign up (registration)
  4. 新增profile => 讓新註冊跟登入的人來填寫基本資料跟準備題。
    目的:避免用戶在還沒回答過問題,就跑去配對 (兩個方法來避免:用基本資料跟準備題來配對;如果沒有回答過問題,跑到首頁要去看配對會被導引到問題集那邊去)

    • User has one Profile <=> Profile belongs_to Uer
    • 想問看看 devise 擴展
    • JC:User 和 Profile 切離成 1 : 1 relation 是很正常的,因為你不會希望每次 SELECT users 的時候都把地址之類的資訊都 select 出來,因為這頻率很高,而這樣做很蠢(累死你家 mysql),而在我們家的打法,Profile 沒有 id,只有 user_id,且 add index unique => true,這樣就很漂亮,create User 的時候用 callback 順便把空的 Profile 一起生出來即可(我猜,應該是在user model裡面用after_create去生出來空的profile。)

    參考:after create and after save

    參考:Ruby on Rails - Creating a profile when user is created
    after save:每次存檔都會啟動;after create:只有第一次create時才會啟動。

#User Model的兩種寫法:
class User < ActiveRecord::Base
第一種:
after_create :build_profile
private
def build_profile
 @profile = @user.build_profile
end

第二種: 
  after_create do
    @profile = @user.build_profile
  end
end

正確的寫法:
    after_create :build_profile

  def build_profile
    Profile.create(user: self)
  end

再來, User 儲存一個 column 叫做 is_profile 來存 Profile 是否有填過完整資料,在必要時才阻擋或提醒需要去完成即可

這邊在 Profile 增加一個 after_savecallback 來檢查 profile 的完整性,ok 時修改 user 即可,而以使用者便利的因素,是不會在註冊時就要他填入過多資料就是了(應該是在profile model裡面寫after_save,驗證完整性應該是用valid?就可以了)

Updating a Rails Model with a Non-default Primary Key

準備題有兩種做法:
- 第一個做法:在profile.rb裡面多弄出來5個attributes,然後準備5個題目,這樣以後擴充可能會有困難。要增加第6個attribute。
- 第二個做法:是profile has_many :option, through: :profile_option,然後可以在new.html.erb一次送出去5個題目。不過會發生錯誤:每個selection都要變成是複選題(:multiple => true),option_ids=>[]才能夠生效。
- item

  1. application_controller,參考:ActiveRecord - 資料驗證及回呼
    application_controller
    def after_sign_in_path_for(resource) 
    case resource 
      when User 
        #dashboard_user_path(resource)
    
        #如果沒有profile,去新增一個。
    
        if current_user.profile.blank?
         new_dashboard_user_profile_path(resource)
        else
          dashboard_user_path(resource)
        end
        #如果profile驗證有錯誤,去edit profile
    
        #if current_user.profile.valid?
    
          #edit_dashboard_user_profile_path(resource)
    
        #else
    
          #root_path
    
        #end
    
      when Manager
        dashboard_admin_managers_path
      else
        root_path 
    end 
    
    應該還是要加上validates_length_ofvalidates_presence_of這種東西,valid?才可以用?

JC新增profile的方法:http://railsfun.tw/t/devise/497
我的方法:

  1. 用戶註冊
  2. 拿到確認信
  3. 回來確認
  4. 登入
  5. 檢查有沒有profile (profile.blank?) 5-1. 沒有的話就新增:要注意用 - 戶可以按別的鈕,然後跑到別的地方去。如果跑到有配對數據、問答題的地方,就會發生錯誤。 5-2. 有的話就登入
← 待解的問題 配對的問題 →