Полето за множествен избор Simple_form не работи

нов потребител на релси тук. Опитвам се да накарам моя формуляр за график да съхранява масив от „дни“, но след няколко опита просто не мога да го накарам да работи.

Ето моите кодове в момента

*schedules/_form.html.erb:*

    <%= simple_form_for @schedule do |f| %>
  <% if @schedule.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@schedule.errors.count, "error") %> prohibited this schedule from being saved:</h2>

      <ul>
      <% @schedule.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <%= f.input :section_id do %>
<%= f.select :section_id, Section.all.map{|s| [s.seccon, s.id]}, :include_blank => true %>
<% end %>

<%= f.association :subject %>


<%= f.collection_select :day_ids, @days, :id, :name, {}, {:multiple => true, :size => 1} %>


   <div class="field">
   <%= f.label :start_time %>
     <%= f.time_select :start_time %>
   </div>
<%= f.input :professor do %> 
        <%= f.select :professor_id, Professor.all.map{|j| [j.procon, j.id]}, :include_blank => true %>
    <% end %>


    <%= f.association :room %>


      <%= f.button :submit %>

 <% end %>

*schedules_controller.rb:*

class SchedulesController < ApplicationController
  before_action :set_schedule, only: [:show, :edit, :update, :destroy]

  # GET /schedules
  # GET /schedules.json
  def index
    @schedules = Schedule.all
    @days = Day.all
  end

  # GET /schedules/1
  # GET /schedules/1.json
  def show
  end

  # GET /schedules/new
  def new
    @schedule = Schedule.new
    @days = Day.all
  end

  # GET /schedules/1/edit
  def edit
  end

  # POST /schedules
  # POST /schedules.json
  def create
    @schedule = Schedule.new(schedule_params)
    @days = Day.all

    respond_to do |format|
      if @schedule.save
        format.html { redirect_to @schedule, notice: 'Schedule was successfully created.' }
        format.json { render action: 'show', status: :created, location: @schedule }
      else
        format.html { render action: 'new' }
        format.json { render json: @schedule.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /schedules/1
  # PATCH/PUT /schedules/1.json
  def update


    respond_to do |format|
      if @schedule.update(schedule_params)
        format.html { redirect_to @schedule, notice: 'Schedule was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @schedule.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /schedules/1
  # DELETE /schedules/1.json
  def destroy
    @schedule.destroy
    respond_to do |format|
      format.html { redirect_to schedules_url }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_schedule
      @schedule = Schedule.find(params[:id])
      @days = Day.all
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def schedule_params
      params.require(:schedule).permit(:section_id, :subject_id, :start_time, :finish_time_id, :professor_id, :room_id, :day_ids)
    end
end

schedule.rb:

class Schedule < ActiveRecord::Base
  belongs_to :section
  belongs_to :subject
  belongs_to :finish_time
  has_and_belongs_to_many :days
  accepts_nested_attributes_for :days, :allow_destroy => true

  validates :section_id, :subject_id, :start_time, :professor_id, :room_id, :presence => true

  belongs_to :professor
  belongs_to :room
end

day.rb:

class Day < ActiveRecord::Base

has_and_belongs_to_many :schedules
default_scope { order(:id)}

has_paper_trail

validates :name, :desc, :presence => true

end

person Dexter Ancheta    schedule 16.10.2013    source източник
comment
Какъв тип дата е day_ids във вашата база данни? Също така, можете ли да разясните по-подробно не можете да го накарате да работи? какво наблюдаваш   -  person lurker    schedule 17.10.2013
comment
day_ids са цели числа. като не работи, което означава, че самото поле за множествен избор се появява, но изглежда не се записва в db   -  person Dexter Ancheta    schedule 17.10.2013


Отговори (1)


Както беше казано тук, най-доброто нещо, което трябва да направите, е да създадете моделна връзка has_many между График и Ден. Ще ви трябва отделна таблица за присъединяване, за да работи връзката. Той ще има: schedule_id и day_id като двете колони. Бихте направили това, защото имате много > много връзки. Може да има много графици, които принадлежат на един ден, и много дни, които принадлежат на график.

Използвах този сценарий в моето приложение:

Рецепта.rb

class Recipe < ActiveRecord::Base

    has_and_belongs_to_many :wines
    default_scope { order(:name) }

end

Wine.rb

class Wine < ActiveRecord::Base
    has_and_belongs_to_many :recipes
    accepts_nested_attributes_for :recipes, :allow_destroy => true
end

Миграция

class AddRecipesWinesJoinTable < ActiveRecord::Migration
    def self.up
    create_table :recipes_wines, :id => false do |t|
        t.column :recipe_id,        :integer,   :null => false
        t.column :wine_id,          :integer,   :null => false
    end
    add_index :recipes_wines, [:wine_id]
    end

    def self.down
        remove_index :recipes_wines, [:wine_id]
        drop_table :recipes_wines
    end
end

_wine_form.html.erb

# @recipes is Recipe.all generated by the controller
<%= w.collection_select :recipe_ids, @recipes, :id, :name, {}, {:multiple => true, :size => 6, :style => 'width:100%'} %>

Надявам се това да помогне.

person SnakeWasTheNameTheyGaveMe    schedule 16.10.2013
comment
РЕДАКТИРАНЕ: Направих вашия метод, но не съм сигурен дали работи. Как да проверя? Освен това премахнах моите :validates day_ids, тъй като изглежда не откриват направен избор. - person Dexter Ancheta; 19.10.2013
comment
Какво имаш предвид моят метод? Можете ли да публикувате отново своя актуализиран код под текущия си код? Предполагам, че начинът да проверите и видите дали работи е да запазите нов екземпляр, като сте избрали няколко дни и след това да се върнете и да го редактирате... ако дните, които сте избрали, са предварително избрани, знаете, че работи. - person SnakeWasTheNameTheyGaveMe; 19.10.2013
comment
актуализира моите кодове. не дните не се избират предварително след създаване или актуализиране на график. - person Dexter Ancheta; 20.10.2013
comment
Вие наистина ли извършихте миграцията? Съществува ли изобщо таблицата days_schedules? Рестартирахте ли сървъра си? Освен това формулярът поне ПОКАЗВА ли правилно имената на дните? - person SnakeWasTheNameTheyGaveMe; 21.10.2013