How to create check boxes, select multiple items and store them -- in rails? -
working on video-game review website practice.
when creating new video-game object, have assign platforms them (xbox, playstation etc.)
my form below , game model has many platforms, while platforms model belongs game
currently use collection select. how turn checkboxes, , able select multiple platofrms checkboxes , save them?
thanks much.
server log
started patch "/games/6" ::1 @ 2015-07-08 05:07:59 -0400 processing gamescontroller#update html parameters: {"utf8"=>"√", "authenticity_token"=>"n9+tnko0702pgpdbc3/rzdqgx92yr zzymkw3zd+dlwjl+zvqlrea1yby1/xexjvexr+sht8xgxod0ytcl+dnmw==", "game"=>{"title"=> "test", "release_date(1i)"=>"2015", "release_date(2i)"=>"7", "release_date(3i)"= >"8", "genre_id"=>["1", ""], "platform_id"=>["1", ""]}, "commit"=>"update game", "id"=>"6"} user load (0.0ms) select "users".* "users" "users"."id" = ? orde r "users"."id" asc limit 1 [["id", 1]] game load (1.0ms) select "games".* "games" "games"."id" = ? limit 1 [["id", 6]] unpermitted parameters: genre_id, platform_id (0.0ms) begin transaction (0.0ms) commit transaction redirected http://localhost:3000/games/6 completed 302 found in 10ms (activerecord: 1.0ms) started "/games/6" ::1 @ 2015-07-08 05:07:59 -0400 processing gamescontroller#show html parameters: {"id"=>"6"} user load (0.0ms) select "users".* "users" "users"."id" = ? orde r "users"."id" asc limit 1 [["id", 1]] game load (0.0ms) select "games".* "games" "games"."id" = ? limit 1 [["id", 6]] (0.0ms) select count("previews"."vote") "previews" "previews"."ga me_id" = ? [["game_id", 6]] cache (0.0ms) select count("previews"."vote") "previews" "previews "."game_id" = ? [["game_id", 6]] (0.0ms) select count("reviews"."vote") "reviews" "reviews"."game_ id" = ? [["game_id", 6]] cache (0.0ms) select count("reviews"."vote") "reviews" "reviews"." game_id" = ? [["game_id", 6]] news load (1.0ms) select "news".* "news" "news"."game_id" = ? or der "news"."id" desc limit 5 [["game_id", 6]] rendered games/_review.html.erb (2.0ms) review load (1.0ms) select "reviews".* "reviews" "reviews"."game_i d" = ? [["game_id", 6]] (0.0ms) select count(*) "reviews" "reviews"."game_id" = ? [["gam e_id", 6]] review load (0.0ms) select "reviews".* "reviews" "reviews"."game_ id" = ? order "reviews"."id" desc limit 5 [["game_id", 6]] rendered games/show.html.erb within layouts/application (16.0ms) completed 200 ok in 162ms (views: 157.1ms | activerecord: 2.0ms) server log 2 when using emu's suggestion <-- still not saving, unpermitted parameters error gone.
started patch "/games/6" ::1 @ 2015-07-08 05:56:55 -0400 processing gamescontroller#update html parameters: {"utf8"=>"√", "authenticity_token"=>"lzku1wa89d6a2i2yarfyiyqwfhlcw iigah0pv6xpuajthyghujkarbuwcpvxliwyoakvsbeip6fxyhmwvzmymw==", "game"=>{"title"=> "test", "release_date(1i)"=>"2015", "release_date(2i)"=>"7", "release_date(3i)"= >"8"}, "platform_ids"=>["4", "5"], "commit"=>"update game", "id"=>"6"} user load (0.0ms) select "users".* "users" "users"."id" = ? orde r "users"."id" asc limit 1 [["id", 1]] game load (0.0ms) select "games".* "games" "games"."id" = ? limit 1 [["id", 6]] (0.0ms) begin transaction (0.0ms) commit transaction (0.0ms) begin transaction (0.0ms) commit transaction redirected http://localhost:3000/games/6 completed 302 found in 9ms (activerecord: 0.0ms) started "/games/6" ::1 @ 2015-07-08 05:56:55 -0400 processing gamescontroller#show html parameters: {"id"=>"6"} user load (0.0ms) select "users".* "users" "users"."id" = ? orde r "users"."id" asc limit 1 [["id", 1]] game load (0.0ms) select "games".* "games" "games"."id" = ? limit 1 [["id", 6]] (0.0ms) select count("previews"."vote") "previews" "previews"."ga me_id" = ? [["game_id", 6]] cache (0.0ms) select count("previews"."vote") "previews" "previews "."game_id" = ? [["game_id", 6]] (0.0ms) select count("reviews"."vote") "reviews" "reviews"."game_ id" = ? [["game_id", 6]] cache (0.0ms) select count("reviews"."vote") "reviews" "reviews"." game_id" = ? [["game_id", 6]] news load (0.0ms) select "news".* "news" "news"."game_id" = ? or der "news"."id" desc limit 5 [["game_id", 6]] rendered games/_review.html.erb (7.0ms) review load (0.0ms) select "reviews".* "reviews" "reviews"."game_i d" = ? [["game_id", 6]] (0.0ms) select count(*) "reviews" "reviews"."game_id" = ? [["gam e_id", 6]] review load (1.0ms) select "reviews".* "reviews" "reviews"."game_ id" = ? order "reviews"."id" desc limit 5 [["game_id", 6]] rendered games/show.html.erb within layouts/application (26.0ms) completed 200 ok in 197ms (views: 177.1ms | activerecord: 3.0ms) games table
create_table "games", force: :cascade |t| t.string "title" t.string "image" t.date "release_date" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "platform_id" t.integer "genre_id" t.integer "review_id" t.integer "steelbook_id" end _game.html.erb <-- if change check boxes use "genre_ids" , "platform_ids" no method error @ games#edit controller
<%= form_for @game |g| %> <p><%= g.label :title %></p> <p><%= g.text_field :title %></p> <p><%= g.label :release_date %></p> <p><%= g.date_select :release_date %></p> <p><%= g.label :genre_id %></p> <p><%= g.collection_check_boxes :genre_id, @genres, :id, :category %></p> <p><%= g.label "platform(s)" %></p> <p><%= g.collection_check_boxes :platform_id, @platforms, :id, :system %></p> <p><%= g.label :image %></p> <p><%= g.file_field :image %></p> <hr> <p><%= g.submit %></p> <% end %> game controller
class gamescontroller < applicationcontroller before_action :authenticate_user! before_action :set_game, only: [:show, :edit, :update, :destroy] def index @games = game.all end def show @reviews = review.where(game_id: @game.id) @previews = preview.where(game_id: @game.id) @news = news.where(game_id: @game.id) end def create @game = game.new(game_params) @game.save redirect_to @game end def new @game = game.new set_platforms set_genres end def edit set_platforms set_genres end def update @game.update(game_params) redirect_to @game end def destroy @game.destroy redirect_to root_path end private def game_params params.require(:game).permit(:title, :image, :release_date, :genre_ids => [], :platform_ids => []) end def set_game @game = game.find(params[:id]) end def set_platforms @platforms = platform.order(:system) end def set_genres @genres = genre.order(:category) end end routes
rails.application.routes.draw devise_for :users root "games#index" resources :games resources :news resources :reviews, except: [:show] resources :previews, except: [:show] end resources :platforms resources :genres end platforms model
class platform < activerecord::base belongs_to :game end game model
class game < activerecord::base has_many :platforms has_many :preview, through: :users has_many :reviews, through: :users has_many :news has_one :genre end
you can use collection_check_boxes.
<p><%= g.collection_check_boxes :platform_ids, @platforms, :id, :system %></p> and change game_params following.
def game_params params.require(:game).permit(:title, :image, :release_date, :genre_id, :platform_ids => []) end didn't tested it. guess require little tweak in code.
Comments
Post a Comment