RoR

时间:2015-07-26 02:40:12

标签: ruby-on-rails checkbox

我是铁路的相对新手。我有一个运行和完成状态的进程(五种可能的不同状态)。该过程按建筑物运行。 (我们从建筑物收集数据。)我试图允许用户自己配置以接收具有细粒度控制的通知电子邮件:按建筑物和完成状态。我尝试使用collection_check_boxes创建一个供用户选择的复选框表,但我甚至不确定collection_check_boxes是否针对这种情况而设计。我很高兴听到这个问题的肯定或否定。

我有以下模块:

class Building < ActiveRecord::Base
    self.primary_key = 'building_id'
    has_many :etl_status
    has_many :email_notifications
end

class BuildingUserPair < ActiveRecord::Base
      self.primary_key = "building_user_pairs_id"
      belongs_to :building
      belongs_to :user
      has_many   :email_notification_settings
end

class EmailNotificationSetting < ActiveRecord::Base
    self.primary_key = "email_notification_settings_id"
    belongs_to  :building_user_pair
end

class EtlResult < ActiveRecord::Base
    self.primary_key = 'etl_results_id'
    # table has 5 rows, with  values 1 -5 with the statuses "HUNKY DORY", "MO BETTA", "LIMPING ALONG", "DISMAIL FAILURE" and "UNEXPECTEDLY IDLE"
end

class EtlResultNotification < ActiveRecord::Base
    belongs_to :building
    belongs_to :user
end

class EtlStatus < ActiveRecord::Base
    self.primary_key  = 'etl_status_id'
    belongs_to :building
    has_many :users, :through => :email_notifications
end

class UsersController < ApplicationController

  def show

    @user                         = User.find(params[:id])
    @buildings                    = Building.active
    @bup                          = []
    @email_notifications_settings = []

    @buildings.each do |bldg|
        bup =  BuildingUserPair.where(user_id: params[:id], building_id: bldg.building_id).first_or_create
        @email_notifications_settings[bldg.building_id] =
            EmailNotificationSetting.where(building_user_pairs_id: bup.building_user_pairs_id).all
    end
end

my users/show.html.erb contains this:

    <%= form_for @user do |f| %>
        <% @buildings.each do |bldg| %>
            <div class="row">
                <div class="col-md-4">
                    <%= bldg.name %>
                </div>
                <%= f.fields_for :email_notification_settings do |ens| %>
                    <%= ens.collection_check_boxes( @email_notifications_settings[bldg.building_id],
                                                   EtlResult.all, :etl_result_id, :result_name) %>
            </div>
        <% end %>
    <% end %>

    <div class="form-buttons">
        <%= submit_tag("Update", data: { buildings: @buildings})  %>
    </div>

除此之外,etl_result_notification表只有两列 它的主键,构建用户对列,然后是数字, 1-5是Etl Results表的外键。因此,这个想法是新的一条线 为复选框创建,如果未选中复选框,则删除表中的行。 就像我说的那样,甚至不确定form_for和collection_check_boxes是否设计成这样做。

我的问题是复选框未正确初始化。他们都没有受到控制。 我猜我需要将其他的paraemters传递给collection_check_boxes,但我无法思考 他们应该是什么。

TIA

1 个答案:

答案 0 :(得分:1)

我认为你的问题太复杂了, 你想要做的是保存一个id列表,该列表前进到用户想要获取的电子邮件。

Rubyist发布https://stackoverflow.com/a/23340368/1380867女巫是你想要做的一个很好的例子。

你应该创建一个serialize :email_notification_ids

#MODEL
class User < ActiveRecord::Base
  serialize :email_notification_ids
end

希望这会有所帮助 快乐的Codding