0

Я использую rails 4.2, и у меня есть форма, которая пытается сделать вставку в модель Response для каждого флажка коллекции_check_boxes. Когда я делаю это, у меня нет никаких ошибок и один из атрибутов, adjective_id, он не сохраняется.Невозможно вставить массив идентификаторов в таблицу соединений с has_many: через ассоциацию

Здесь вы можете увидеть, как пары выглядят, когда я выбираю 4 из 58 флажков:

"response"=>{"relation"=>"family", "adjective_id"=>["2", "14", "16", "28", ""]}, "commit"=>"Answer", "survey_sruid"=>"d5e7b675370614d1331f"} 

Здесь вставка:

INSERT INTO "responses" ("relation", "survey_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["relation", "3"], ["survey_id", 1], ["created_at", "2015-02-11 02:39:41.409276"], ["updated_at", "2015-02-11 02:39:41.409276"]] 

Мне нужно, чтобы получить adjective_id в заявление о вставке, примерно следующее:

INSERT INTO "responses" ("relation", "survey_id", "adjective_id", "created_at", "updated_at") 
  • Как я могу это получить, чтобы правильно вставить?
  • Есть ли способ сделать 1 строку в таблицах ответов с теми же «отношениями», «survey_id», «created_at» и «updated_at» для каждого «adjective_id» в массиве params?

Модели

class Survey < ActiveRecord::Base 
has_many :responses 
has_many :adjectives, through: :responses 
belongs_to :nruser 
end 

class Response < ActiveRecord::Base 
belongs_to :survey 
belongs_to :adjective 
end 

class Adjective < ActiveRecord::Base 
has_many :responses 
has_many :surveys, through: :responses 
end 

schema.rb:here

Контроллер

class ResponsesController < ApplicationController 

def new 
    @survey = Survey.find_by(sruid: params[:survey_sruid]) 
    @response = @survey.responses.build 
end 

def create 
    @survey = Survey.find_by(sruid: params[:survey_sruid]) 
    @response = @survey.responses.create(response_params) 
    redirect_to root_path 
end 

private 

    def response_params 
     params.require(:response).permit(:relation, { :adjective_id => [] }) 
    end 
end 

Маршруты

Rails.application.routes.draw do 

root    'static_pages#home' 
resources :surveys, only: [:new, :create, :show, :destroy] 
resources :surveys, param: :sruid, only: [:create] do 
    resources :responses, only: [:new, :create] 
end 
resources :adjectives, only: [:index] 
end 

Форма

<%= form_for @response, url: survey_responses_path do |r| %> 
    <aside class="col-md-3"> 
     <%= r.label :relation, @survey.nruser.name.titleize + " es un:" %> 
     <p><%= r.select :relation, options_for_select([['familiar', 3], ['amigo', 2], ['colega', 1], ['conocido',0]]) %></p> 
     </br> 
     <%= r.submit "Responder YA!", class: "btn btn-success" %> 
    </aside> 

    <aside class="col-md-9"> 
     <div class="btn-group" data-toggle="buttons"> 
      <%= r.collection_check_boxes :adjective_id, Adjective.all, :id, :adjective do |b| 
        b.label(class: 'btn btn-primary') {b.check_box + b.text} 
      end %> 
     </div> 
    </aside> 
<% end %> 

Я надеюсь, что это ясный вопрос. Я ноб с рубином на рельсах, поэтому я был бы благодарен за любой ответ, чтобы прояснить мои вопросы.

Спасибо!

+0

Вы видели [это] (https://stackoverflow.com/questions/28049879/strong-parameters-unpermitted-parameters-tags-in-has-many-through-relation) вопрос и ответы? – pdoherty926

+0

Хорошо, я просто прочитал этот пост, спасибо за ответ. Поэтому в моем случае разрешен параметр: adjective_id. Теперь, единственный способ назначить значения, которые он выполняет, разделяет мой массив, как в этом ответе?и Почему рельсы не признают, что adjective_id является атрибутом ответа объекта? –

ответ

0

Я не знаю, является ли это лучшим ответом для этого, но теперь это единственное, что у меня есть.

def create 

    @survey = Survey.find_by(sruid: params[:survey_sruid]) 

    #Because collection_check_boxes adds a blank value at the end of the array. 
    adjectives_ids = params[:response][:adjective_id].reject! { |c| c.empty? } 

    adjectives_ids.each do |adj_id| 
     @response = adjectives_ids.map { |adj_id| @survey.responses.create(response_params adj_id) 
    end 

    redirect_to root_path 
    end 

private 

    def response_params(adj_id) 
     params.require(:response).permit(:relation).merge(adjective_id: adj_id) 
    end 

Тогда у меня есть результат, что я искал:http://imgur.com/vXnnwdb

Если кто-то знает лучший способ, чтобы получить это, пожалуйста, дайте мне знать. Спасибо

+0

Не будет ли '@ response' некорректным, если существует более одного' adjective_id'? Возможно, вам захочется рассмотреть возможность использования: '@response = adjective_ids.map {| adj_id | @ survey.responses.create (response_params adj_id)} '. – pdoherty926

+0

Да, вы правы, я обновлю свой ответ. Спасибо за исправление –

Смежные вопросы