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
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 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ń
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
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.
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