RoR - 带复选框的动态下拉菜单

时间:2016-04-18 13:50:53

标签: ruby-on-rails checkbox grouped-collection-select

我希望在其中实现带有复选框的动态下拉列表,以便邮件的发件人可以选择多个收件人。

目前,我只在消息textarea下有一个收件人列表。

_recipients.html.erb:

<% @recipients.each do |user| %>
  <label for="user<%= user.id %>" >
    <span class="list-group-item"><%= user.full_name %></span>
    <%= check_box_tag "message[user_tokens][]", user.id, @message.users.include?(user), id: "user#(user.id)", class: "form-control" %>
  </label>

User.rb:

class User < ActiveRecord::Base

  rolify
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  validates :full_name, presence:true,
            length: {minimum: 4 }

  has_many :messages, foreign_key: :sender_id
  has_many :notes
  has_many :homeworks
  has_many :hw_comments
  belongs_to :classmodule
  belongs_to :student

recipient.rb:

class Recipient < ActiveRecord::Base
    belongs_to :message
    belongs_to :user

    validates :user_id, presence: true
end

messages_controller.rb:

class MessagesController < ApplicationController
    before_action :authenticate_user!

    def new
        @message = Message.new
        @recipients = User.all 
        @recipients = @recipients.page(params[:page]).per(8)
    end

    def create
        @message = current_user.messages.build(message_params)

        if @message.save
            flash[:success] = "Message sent"
            redirect_to messages_path
        else
            flash[:alert] = "Something went wrong"
            render :new
        end
    end

    def index
        @messages = Recipient.where(:user_id => current_user.id).order('created_at DESC')
    end

    private
    def message_params
        params.require(:message).permit(:title, :body, :sender_id, user_tokens: [])
    end 
end

例如,是否可以使用collection_select将复选框和名称输入到下拉列表中?很高兴在需要时提供更多代码。感谢。

2 个答案:

答案 0 :(得分:0)

如果您正在使用引导程序,则可以通过下拉列表执行此操作,请参阅示例http://www.bootply.com/8V6EpWyMO3

(尽管你可能会考虑js中的一些手动覆盖,因为点击对点击的内容有多敏感)

对于导轨部分

如果您没有使用简单的表单,并且确实需要引导程序解决方案,那么您需要编写自定义输入。

答案 1 :(得分:0)

有不同的方法,例如将bootstrap select与多个一起使用,这样您只有一个选择能够选择多个选项。您需要调整recipient_fields.slim

另一种方法是使用simple_formcocoon,因为茧处理新的&#34;视图&#34;关联模型。可能是一件简单的事情:

(为方便起见使用超薄)

.nested-fields = f.collection_select :user_id, User.all, :id, :name = link_to_remove_association 'remove recipient', f

link_to_add_association

每次要添加新收件人时,都会呈现新视图:

function checkPRT(){ $.ajax({ type: 'GET', url: 'check_file.php', data: {folder_path: '\\FILESHARE\folder\path\'}, success: function(data) { //alert('success!'); if(data=='true'){ window.location.href = "complete.php"; } }, error: function (data) { alert('failed'); } }); } ,通过cocoon处理渲染和销毁html元素。