Problem z dodawaniem wartości z formularza do bazy

Cześć
Mam problem z którym już jakiś czas nie mogę sobie poradzić. Postanowiłem wypróbować opcję array w PostgreSQL i wszystko jest w porządku gdy dodaje wartości z railsowej konsoli ale jeżeli próbuje dodać z formularza to w ogóle się nie zapisują. Z góry dzięki za pomoc :slight_smile:

Baza danych:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string "name"
      t.integer "ids", array: true, default: []
      t.timestamps null: false
    end
  end
end

Controller:

class UsersController < ApplicationController
  def index
    @user = User.all
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to users_path
    else
      render user_new_path
    end
  end

  def edit
  end

  def show
  end

  private
  def user_params
    params.require(:user).permit(:name, ids: [])
  end
end

Formularz:

<%= form_for @user do |f| %>
  <%= f.label :name, "Nazwa:" %>
  <%= f.text_field :name %>
  <%= f.label :ids, "Id 1:" %>
  <%= f.text_field :ids %>
  <%= f.label :ids, "Id 2:" %>
  <%= f.text_field :ids %>
  <%= f.submit %>
<% end %>

Podrzuć jeszcze Logi z serwera :slight_smile: Na pierwszy rzut oka wszystko wydaje się w miarę okej

Started POST "/users" for 127.0.0.1 at 2016-05-11 23:42:55 +0200 Processing by UsersController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"WWVYpnqEKR7aykriaSHUKy54AFDilP5fkEmUKIl45QjtCrCIVT2R32Ofv/lgy9wrLg/NM2lyUoIs6AReJLOl5w==", "user"=>{"name"=>"Michał", "ids"=>"222"}, "commit"=>"Create User"} Unpermitted parameter: ids e[1me[35m (0.3ms)e[0m BEGIN e[1me[36mSQL (121.4ms)e[0m e[1mINSERT INTO "users" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"e[0m [["name", "Michał"], ["created_at", "2016-05-11 21:42:55.647415"], ["updated_at", "2016-05-11 21:42:55.647415"]] e[1me[35m (10.8ms)e[0m COMMIT Redirected to http://localhost:3000/users Completed 302 Found in 201ms (ActiveRecord: 132.8ms)

W formularzu mam dwa pola odnoszące się do ids, wpisuje dwie wartości a jak widzimy wyżej przypisywana jest tylko ta druga. O co może chodzić z unpermitted parameter?

“Unpermitted parameter: ids”

W kontrolerze, zmień

Tu masz kilka rozwiązań

Zamieniłem w formularzu f.text_field :ids na text_field_tag "ids[]" i teraz przydziela wszystkie wpisane wartości z formularza do tablicy ids, lecz nadal nie zapisuje. Komunikatu Unpermitted parameter: ids już nie ma. W modelu dodałem jeszcze serialize :ids, Array ale nic nie pomogło. Macie jeszcze jakieś wskazówki? Bo ja nie mam pojęcia jak to zrobić.

Started POST "/users" for 127.0.0.1 at 2016-05-12 12:05:31 +0200 Processing by UsersController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"Ld/VzlGIZ+7xuPHOdKMWYFqjmj00PqSuMaMZMLGeUbhl37ZwgpL+jmlrGIy1t6tN/3H9UsRyvtWi3eWnu5oUWA==", "user"=>{"name"=>"Michał"}, "ids"=>["1", "2"], "commit"=>"Create User"} (0.2ms) BEGIN SQL (0.2ms) INSERT INTO "users" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["name", "Michał"], ["created_at", "2016-05-12 10:05:31.334233"], ["updated_at", "2016-05-12 10:05:31.334233"]] (48.2ms) COMMIT Redirected to http://localhost:3000/users Completed 302 Found in 51ms (ActiveRecord: 48.6ms)

Jak popatrzysz na log, to widać:

 "user"=>{"name"=>"Michał"}, "ids"=>["1", "2"]

a ids powinno być wewnątrz "user". Musisz zmienić nazwę w formularzu - zdaje się z ids[] na user[ids][]

Zrobiłem tak jak napisałeś, teraz ids jest w nawiasie klamrowym, lecz nadal nie zapisuje wartości w bazie. Poniżej log:

Started POST "/users" for 127.0.0.1 at 2016-05-12 18:27:48 +0200 Processing by UsersController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"zJBI6HDTnE8OwsJZkk+eUvEs5azLxR9N849vk/2uTDDFl2QQ9MpqhGQMkbDFLisGTwaviwLWpYFriuIoM2TZLg==", "user"=>{"name"=>"Michał", "ids"=>["110", "220"]}, "commit"=>"Create User"} (0.4ms) BEGIN SQL (0.3ms) INSERT INTO "users" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["name", "Michał"], ["created_at", "2016-05-12 16:27:48.780341"], ["updated_at", "2016-05-12 16:27:48.780341"]] (34.3ms) COMMIT Redirected to http://localhost:3000/users Completed 302 Found in 39ms (ActiveRecord: 35.0ms)

Zmień na t.string / ustaw input na number / w kontrolerze rzutuj input na liczbę. Powinno działać

Zmieniłem na string ale nadal nic.

Spróbuje jeszcze raz zrobić wszystko od początku, może coś przeoczyłem. Ale dzięki wielkie za pomoc i zainteresowanie :slight_smile:

Masz gem ‘postgres_ext’ ? Bo z tego co mi się wydaje, to standardowo Railsy nie obsługują typu array. Ale czy ty w ogóle korzystasz z postgresa?

Miałem tylko gem 'pg', '~> 0.15', zainstalowałem postgres_ext dodałem do application.rb require 'postgres_ext' ale nadal nie zapisują się wartości z ids. Wydaje mi się, że korzystam, instalowałem według tego opisu. :smiley:

Po za tym na początku dodawałem wartości z irb i zapisywało się normalnie.

Teraz jak próbuje wpisać z irb to nie zapisuje, więc musiałem coś poknocić wcześniej. Zrobię to od początku jeszcze raz.

Spróbuj zmienić t.integer na t.text