jak zezwolić na tablicę z silnymi parametrami

Mam działającą aplikację Rails 3, która używa has_many: poprzez skojarzenia, które nie są, ponieważ przerobiłem ją jako aplikację Rails 4, pozwalając mi zapisywać identyfikatory z powiązanego modelu w wersji Rails 4.

Są to trzy odpowiednie modele są takie same dla dwóch wersji.

Kategoryzacja.rb

class Categorization < ActiveRecord::Base

  belongs_to :question
  belongs_to :category
end
Pytanie.rb
has_many :categorizations
has_many :categories, through: :categorizations

Kategoria.rb

has_many :categorizations
has_many :questions, through: :categorizations

W obu aplikacjach identyfikatory kategorii są przekazywane do akcji create like to

  "question"=>{"question_content"=>"How do you spell car?", "question_details"=>"blah ", "category_ids"=>["", "2"],

W aplikacji Rails 3, kiedy tworzę nowe pytanie, wstawia się je do tabeli pytań, a następnie do tabeli kategorii

 SQL (82.1ms)  INSERT INTO "questions" ("accepted_answer_id", "city", "created_at", "details", "province", "province_id", "question", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)  [["accepted_answer_id", nil], ["city", "dd"], ["created_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["details", "greyound?"], ["province", nil], ["province_id", 2], ["question", "Whos' the biggest dog in the world"], ["updated_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["user_id", 53]]
  SQL (0.4ms)  INSERT INTO "categorizations" ("category_id", "created_at", "question_id", "updated_at") VALUES (?, ?, ?, ?)  [["category_id", 2], ["created_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["question_id", 66], ["updated_at", Tue, 14 May 2013 17:10:25 UTC +00:00]]

W aplikacji rails 4, po przetworzeniu parametrów o których mowa # create, dostaję ten błąd w logach serwera

Unpermitted parameters: category_ids

I pytanie jest dopiero wstawiane do tabeli pytań

 (0.2ms)  BEGIN
  SQL (67.6ms)  INSERT INTO "questions" ("city", "created_at", "province_id", "question_content", "question_details", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["city", "dd"], ["created_at", Tue, 14 May 2013 17:17:53 UTC +00:00], ["province_id", 3], ["question_content", "How's your car?"], ["question_details", "is it runnign"], ["updated_at", Tue, 14 May 2013 17:17:53 UTC +00:00], ["user_id", 12]]
   (31.9ms)  COMMIT

Chociaż nie przechowuję category_ids w modelu pytań, ustawiłem category_ids jako dozwolony parametr w questions_controller

   def question_params

      params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids)
    end

Czy ktoś może wyjaśnić jak mam zapisać category_ids? Zauważ, że w categories_controller nie ma akcji create.rb każdej aplikacji.

Są to trzy tabele, które są takie same w obu aplikacjach

 create_table "questions", force: true do |t|
    t.text     "question_details"
    t.string   "question_content"
    t.integer  "user_id"
    t.integer  "accepted_answer_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "province_id"
    t.string   "city"
  end

 create_table "categories", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "categorizations", force: true do |t|
    t.integer  "category_id"
    t.integer  "question_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

Update

To jest tworzenie akcji z aplikacji Rails 3.]}
  def create
      @question = Question.new(params[:question])
      respond_to do |format|
      if @question.save
        format.html { redirect_to @question, notice: 'Question was successfully created.' }
        format.json { render json: @question, status: :created, location: @question }
      else
        format.html { render action: "new" }
        format.json { render json: @question.errors, status: :unprocessable_entity }
      end
    end
end
To jest tworzenie akcji z aplikacji Rails 4.]}
   def create
      @question = Question.new(question_params)

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

Oto pytanie metoda

 private
    def question_params 
      params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids)
    end
Author: mu is too short, 2013-05-14

5 answers

To https://github.com/rails/strong_parameters wydaje się, że odpowiednia sekcja dokumentów:

Dozwolone typy skalarne to String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time, DateTime, StringIO, IO, ActionDispatch:: Http:: UploadedFile and Rack:: Test:: UploadedFile.

Aby zadeklarować, że wartość w params musi być tablicą dozwolonych wartości skalarnych Mapuj klucz do pustej tablicy:

params.permit(:id => [])

W mojej aplikacji, category_ids są przekazywane do akcji create w tablicy

"category_ids"=>["", "2"],

Dlatego, deklarując silne parametry, jawnie ustawiam category_ids jako tablicę

params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids => [])
Teraz działa idealnie!
 474
Author: Leahcim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 16:05:43

Jeśli chcesz zezwolić na tablicę hashów (lub an array of objects z perspektywy JSON)

params.permit(:foo, array: [:key1, :key2])

2 punkty do zauważenia tutaj:

  1. array powinien być ostatnim argumentem metody permit.
  2. należy podać klucze hash w tablicy, w przeciwnym razie pojawi się błąd Unpermitted parameter: array, który jest bardzo trudny do debugowania w tym przypadku.
 80
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-17 09:53:42

Powinno być jak

params.permit(:id => [])

Również od wersji rails 4+ można użyć:

params.permit(id: [])
 12
Author: Matias Seguel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-18 16:05:21

Jeśli masz taką strukturę hashową:

Parameters: {"link"=>{"title"=>"Something", "time_span"=>[{"start"=>"2017-05-06T16:00:00.000Z", "end"=>"2017-05-06T17:00:00.000Z"}]}}

Więc tak to działa:

params.require(:link).permit(:title, time_span: [[:start, :end]])
 7
Author: Fellow Stranger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 15:49:28

Nie mogę jeszcze komentować, ale podążając za Innym rozwiązaniem, Możesz również zagnieżdżać się w przypadku, gdy masz klucze, których wartości są tablicami. TAK:

filters: [{ name: 'test name', values: ['test value 1', 'test value 2'] }]

To działa:

params.require(:model).permit(filters: [[:name, values: []]])
 1
Author: Daniel Duque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-12 16:19:33