2016-05-29 82 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,以便允许添加电话号码。