RoR - динамический выпадающий с флажками
Я хочу реализовать динамическое раскрывающееся меню с флажками, чтобы отправитель сообщения мог выбрать несколько получателей.
В настоящее время у меня просто есть список получателей под сообщением 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 ответа
Если вы используете загрузчик, вы можете сделать это с помощью раскрывающегося списка, см. Пример http://www.bootply.com/8V6EpWyMO3
(хотя вы можете рассмотреть некоторые ручные переопределения в js, чтобы узнать, насколько чувствителен клик к тому, что нажимается)
Для части рельсов
Если вы не используете простую форму и хотите использовать загрузочное решение, вам нужно написать собственный ввод.
Существуют разные подходы, например, использование начальной загрузки с несколькими, так что у вас будет только один выбор с возможностью выбора нескольких вариантов. Для чего вам придется адаптировать свой message_params
,
Другой подход заключается в использовании simple_form и cocoon, поскольку cocoon обрабатывает рендеринг новых "представлений" по связанным моделям. Может быть что-то так просто, как:
(используя slim для удобства)
recipient_fields.slim
.nested-fields
= f.collection_select :user_id, User.all, :id, :name
= link_to_remove_association 'remove recipient', f
И отображать новое представление каждый раз, когда вы хотите добавить нового получателя с помощью:
link_to_add_association
, обработка рендеринга и уничтожение html-элементов коконом.