Как исправить коллекцию переключателей Rails, всегда возвращающую последнее значение? - PullRequest
1 голос
/ 23 апреля 2019

У нас есть приложение, в котором много моделей, две из них ведут себя странно (Candidate и MarketSegment).

Каждая сущность класса Candidate содержит атрибут market_segment_id. У нас также есть форма, которая позволяет нам редактировать экземпляр Candidate и отправлять / обновлять через JSON-запрос.

Когда я пытаюсь визуализировать партиал, который создает коллекцию радиокнопок с опциями сегмента рынка, которые будут выбраны для этого кандидата в форме редактирования, я всегда получаю последнее значение / market_segment_id списка радиокнопок в хэше params , то есть market_segment_id => '35' каждый раз.

Мы уже пробовали много разных подходов, в том числе:

1) Проверен html, чтобы подтвердить, генерирует ли помощник collection_radio_buttons правильные значения для каждой кнопки;

2) Встроенный цикл для создания каждой радио-кнопки с соответствующими атрибутами вручную.

<%= render partial: 'shared/forms/market_segments_select', locals: {f: f} %>

ruby ​​/ erb частичный контент, который генерирует список переключателей

<div class="w-100 h4 overflow-scroll overflow-x-hidden bn pt3">
  <%= f.collection_radio_buttons :market_segment_id, MarketSegment.all, :id, :description_pt do |m| %>
    <div class="w-100 mb2 market_segment__radio-group">
      <%= m.radio_button %>
      <%= m.label %>
    </div>
  <% end %>
</div>

HTML, сгенерированный частичным

<div class="w-100 h4 overflow-scroll overflow-x-hidden bn pt3">
  <input type="hidden" name="candidate[market_segment_id]" value="" />
    <div class="w-100 mb2 market_segment__radio-group">
      <input type="radio" value="1" name="candidate[market_segment_id]" id="candidate_market_segment_id_1" />
      <label for="candidate_market_segment_id_1">Agronegócio e Bioenergia</label>
    </div>

    <div class="w-100 mb2 market_segment__radio-group">
      <input type="radio" value="2" name="candidate[market_segment_id]" id="candidate_market_segment_id_2" />
      <label for="candidate_market_segment_id_2">Alimentos</label>
    </div>

    <div class="w-100 mb2 market_segment__radio-group">
      <input type="radio" value="3" name="candidate[market_segment_id]" id="candidate_market_segment_id_3" />
      <label for="candidate_market_segment_id_3">Auditoria</label>
    </div>
...and so on until market_segment_id = 35

Титулы

Parameters: {"utf8"=>"✓", "authenticity_token"=>"Sgpo39Lo...==", "candidate"=>{"avatar"=>"", ..., "market_segment_id"=>"35", ...}, "commit"=>"Atualizar", "id"=>"8"}

действие контроллера

def update
    respond_to do |format|
      if @candidate.update(candidate_params)
        create_candidate_skill_tags

        format.html do
          redirect_to admin_candidate_path(@candidate),
                      notice: 'Candidato atualizado com sucesso'
        end
        format.json { render json: @candidate, status: :ok }
      else
        format.html { render :edit }
        format.json do
          render json: @candidate.errors, status: :unprocessable_entity
        end
     end
  end
end

Независимо от переключателя, который я выбираю, параметры всегда получают market_segment_id => '35' (это последняя запись таблицы MarketSegment.

1 Ответ

0 голосов
/ 23 апреля 2019

Я сделал похожую вещь.Вы могли бы сделать что-то вроде этого

  def create_candidate_skill_tags 
     new_skill_tags_from_params.map do |skill_text| 
      @candidate.skill_tags << SkillTag.where(id: 
    skill_text).first_or_create
  end
 end


<label for="users"><strong>Your Form</strong></label>
<div class="custom-select form-control pull-right">
 <%= form.collection_check_boxes(:market_segment_id, MarketSegment.all, :id, 
    :description, 
  checked: @candidate.market_segments.map(&:id)) do |b| %>    
    <%= b.check_box %> <%= b.label %>
 <% end %>
</div>

, также вам нужно в вашемандидате.rb

has_and_belongs_to_many :market_segments, foreign_key: :candidate_id

и в market_segment.rb

has_and_belongs_to_many :candidates 

убедиться, что у вас есть :candidate_id столбец в вашей БД.или как ты это сделал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...