Search code examples
ruby-on-railsformsruby-on-rails-4simple-form

Rails Simple Form Association submission not updating


I have a problem with has_many relationships setting up forms that do not update the values after submission.

Example

Upon submission of a new character, vn_id does not get updated and in Rails Consoles when I try to check for characters in a Vn, it returns empty.

I am trying to set up a form for characters which belongs to Vn which will be linked through the association but upon submission, it is not linked to Vn.

class Character < ActiveRecord::Base
    validates :name, :presence => true
    validates :summary, :presence => true
    belongs_to :vn
end

class Vn < ActiveRecord::Base
  has_many :characters
  validates :name, presence: true
  accepts_nested_attributes_for :characters
end

Form to create a new Character

<%= simple_form_for @character do |f| %>
      <div class="col-lg-12">
        <%= f.input :summary,input_html: {style: "height:150px;"} %>
    </div>
      <div class="col-lg-12">
        <%= f.association :vn, as: :check_boxes %>
    </div>
      <%= f.button :submit , class: "btn btn-primary" %>
    <% end %>

Controllers

class CharactersController < ApplicationController

    def show
        @character = Character.find(params[:id])
    end

    def new
        @character = Character.new
    end

    def create  
        @character = Character.new(char_params)  
        if @character.save

        else
            render :action=>"new"
        end

    end

    private
        def char_params
        params.require(:character).permit(:name, :summary,:voiceactor,:vn_name,vn_id: [])
    end

end

class VnsController < ApplicationController

    def show
        @vn = Vn.find(params[:id])
    end

    def new
        @vn = Vn.new
    end

    def create  
        @vn = Vn.new(vn_params)  
        if @vn.save

        else
            render :action=>"new"
        end

    end

    private
        def vn_params
    def vn_params
        params.require(:vn).permit(:name, :summary,:genre,:developer,:rating,vn_id: [])
    end

    end

end

Submission unpermitted vn_id

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"O2s6GVs77GGUMC5u3eZ9ebv/0l5u0MwP44yS8WGCQnjgwSgHfkbCmhEOUo6WKIMSMo5IfDuNYtMzyphnT/5cwQ==", "character"=>{"name"=>"2222", "voiceactor"=>"111", "summary"=>"one two tthee", "vn_id"=>"32"}, "commit"=>"Create Character"}
Unpermitted parameter: vn_id
   (0.1ms)  begin transaction
  SQL (0.6ms)  INSERT INTO "characters" ("name", "summary", "voiceactor", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["name", "2222"], ["summary", "one two tthee"], ["voiceactor", "111"], ["created_at", "2015-10-23 10:34:00.285447"], ["updated_at", "2015-10-23 10:34:00.285447"]

Solution

  • The problem is you're trying to permit an array for a singular association.


    The f.association input is for your belongs_to association, so why would it allow multiple records?

    You can even see how this works here:

    enter image description here

    The above are methods only for has_many

    In short, they don't exist for belongs_to


    Thus, when you call f.association :vn, you're populating an attribute vn_id which can then be associated in your database.

    The only time you'd have vn_ids is if you used has_many etc.

    This means...

    def character_params
        params.require(:character).permit(:vn_id) 
    end
    

    with

    f.association :vn
    

    ... should work