积极记录。进行"访问"与Ruby on Rails对抗

时间:2016-05-29 14:42:46

标签: ruby-on-rails ruby activerecord

我目前有Check_In模型 belongs_to 我的Subscriber模型 has_many Check_Ins

Subscriber模型接收phone_number以及其他一些属性,Check_In模型接受" visit_amount"作为整数。

在有Subscribes信息表格的人Check_In后,我希望subscriberCheck_In电话号码放在Check_In视图表单中,以便选择Subscriber

在他们将数字放在表单中之后,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 模型会将+ 1加到&#34; visit_amount&#34;特别是class Check_In < ActiveRecord::Base belongs_to :subscriber end

我是铁杆新手,我想知道这是否可行?如果是这样,我该如何实现此功能?我将展示我当前的代码供参考。

MODEL

public static void main(String[] a) throws SQLException {
   JFrame frame = new JFrame();
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   **frame.add(new SearchTripList(this));**
   frame.pack();
   frame.setSize(400, 400);
   frame.setVisible(true);
}


**private JFrame mainFrame;
public SearchTripList(JFrame mainFrame) throws SQLException {
    this.mainFrame = mainFrame;**
    setLayout(new BorderLayout());
    clientListElements = new DefaultListModel();
    list = new JList(clientListElements);
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.setVisibleRowCount(listRader);
    pnlCenter.add(new JScrollPane(list));
    add(pnlCenter, BorderLayout.CENTER);
    add(pnlNorth, BorderLayout.NORTH);
    add(pnlSouth, BorderLayout.SOUTH);
    pnlNorth.add(lvlVeckaAvgang);
    pnlNorth.add(lblStad);
    pnlNorth.add(lblTidAvgang);
    pnlNorth.add(lblAvgangFran);
    // pnlCenter.add(new JScrollPane(list));

    // list.addListSelectionListener(new ListSelectionListener() {
    // public void valueChanged(ListSelectionEvent event) {
    // // setBackground(colors[list.getSelectedIndex()]);
    //
    // }
    // });
    pnlSouth.add(tfDest);
    pnlSouth.add(btnSearch);
    pnlSouth.add(btnDone);
    createListeners();

}

private class Listener implements ActionListener {
    **JFrame mainFrame;
    public Listener(JFrame mainFrame){
        this.mainFrame = mainFrame;
    }**
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnSearch) {

           dest = tfDest.getText();
           try {
               connect();
               writeData();
           } catch (SQLException e1) {
               // TODO Auto-generated catch block
               e1.printStackTrace();
           }

       }else if (e.getSource()== btnDone){
           **PersonInfo newPanel = new PersonInfo(some variables);
           this.mainFrame.add(newPanel);**
   }

}

frame

我有基本的控制器和视图。此时一切都非常基本,但这是我需要这个应用程序的主要功能。

3 个答案:

答案 0 :(得分: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将自动更新。

答案 1 :(得分: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,以便添加电话号码。

答案 2 :(得分: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,否则您的参数会显示为{ check_in: { phone_number: '1234-56-7890' },您必须在创建操作中获取params[:check_in][:phone_number],这让我觉得不舒服(请检查没有电话号码)。