2016-05-29 74 views
0

製作使用Ruby一個 「拜訪」 反我現在有一個Check_In模型belongs_to的Subscriber模型,的has_manyCheck_Ins有效記錄。 on Rails的

Subscriber模型接受phone_number以及其他一些屬性,Check_In模型將「visit_amount」作爲整數。

經過一個人Subscribes與查看錶單我想他們的選項Check_In通過將他們的subscriber phone_number在Check_In視圖窗體。

Check_In的數字放在表格中後,模型將+1加到該特定Subscriber上的「visit_amount」。

我是新來的鐵軌,我想知道這是否可能?如果是這樣,我應該如何去實現這個功能?我將顯示當前的代碼以供參考。

模型

class Subscriber < ActiveRecord::Base 
has_many :check_ins 

validates :first_name, presence: true 
validates :last_name, presence: true 
validates :email, presence: true 
validates :phone_number, presence: true 

def date_joined 
    created_at.strftime("%-m/%-d/%-y") 
end 

def expiration_date 
    (created_at + 1.year).strftime("%-m/%-d/%-y") 
end 
end 

class Check_In < ActiveRecord::Base 
belongs_to :subscriber 
end 

我有基本的控制器和視圖。在這一點上,一切都非常基本,但這是我需要這個應用程序的主要功能。

+0

很容易做到,從我的手機回答,所以需要一些時間來鍵入它大聲笑 – bkunzi01

+0

謝謝!欣賞幫助 – Bitwise

回答

1

以下是您的用例的創建操作。

class CheckInsController < ApplicationController 
    def create 
    # First, create a CheckIn that belongs to the current_subscriber 
    @check_in = CheckIn.new.tap do |check_in| 
     check_in.subscriber = current_subscriber 
    end 

    # Then check if submitted phone number is correct 
    if params[:phone_number] == current_subscriber.phone_number 
     @check_in.save 
    else 
     # do something when the verification failed 
    end 
    end 

    # more code... 
end 

希望有所幫助。

如果你沒有在應用程序的認證,你可以做

def create 
    subscriber = Subscriber.find_by(phone_number: params[:phone_number]) 
    if subscriber 
    CheckIn.create(subscriber: subscriber) 
    else 
    # some code 
    end 
end 

最後,你的表格應該是這樣的:

<%= form_tag check_ins_path do %> 
    <%= label :phone_number %> 
    <%= text_field_tag :phone_number %> 
    <%= submit_tag 'Check In' %> 
<% end %> 

不要使用form_for @check_in或您的PARAMS的樣子{ check_in: { phone_number: '1234-56-7890' }並且您必須在創建操作中獲取params[:check_in][:phone_number],這對我來說感覺不舒服(檢入沒有電話號碼)。

+0

這有助於確保。唯一的問題是我不認爲他們將是一個current_user。基本上我想做一個SQL查詢說,如果輸入的數字存在?爲該特定號碼添加1以反擊。如果這是有道理的? – Bitwise

+0

使用第二種解決方案,並嘗試'counter_cache'。 – floum

+0

謝謝。最後一個問題我的表單應該如何看待這個視圖?如果text_field爲? – Bitwise

1

:counter_cache可以做你想做的。添加一個新的領域的呼叫count_of_check_ins表中的用戶,然後更新類的定義如下:

class Subscriber < ActiveRecord::Base 
    has_many :check_ins 
end 

class Check_In < ActiveRecord::Base 
    belongs_to :subscriber, counter_cache: :count_of_check_ins 
end 

的count_of_check_ins將自動更新。

+0

這對我的情況非常重要,只有當用戶輸入電話號碼時纔會計數。這會爲我的情況工作嗎? – Bitwise

+0

我喜歡你的想法。如果你能詳細說明,我想我只是好奇而已。 – Bitwise

+0

我不知道是否有一個簡單的聲明可以做到這一點。對於你的情況,我建議你在Check_In模型中添加一個after_update和after_destroy回調函數,並且進行你自己的計算。 – nickcen

1

在要的表單來接受用戶輸入的簽入的頁面放在其相應的動作以下(通常會是CheckinsControllernew動作):

def new 
    @checkin = Check_In.new 
end 

def create 
    user = current_user #assuming u have a current user method 
    @checkin = user.check_in.new(checkin_params) 
    if @checkin.save 
    # ... 
    end 
end 

private 

def checkin_params 
    params.require(:check_in).permit(:phone_number) 
end 

然後在模型中CheckIn您需要添加accepts_nested_attributes_for,以便允許添加電話號碼。