2 Stimmen

Rails Wie man die "Erstellen" Aktion im HABTM Model Controller schreibt

Ich bin relativ neu in Rails und habe enorme Schwierigkeiten, mit Modellen zu arbeiten, die HABTM-Verbindungen zwischen sich haben.

Dies sind meine Modelle:

challenge.rb:

class Challenge < ActiveRecord::Base
    has_and_belongs_to_many :skills
    attr_accessible :description, :name, :relevant_content, :solutions, :skills
end

skill.rb:

class Skill < ActiveRecord::Base
    has_and_belongs_to_many :challenges

    attr_accessible :name
end

Ich habe auch eine Verbindungstabelle namens challenges_skills erstellt, die die folgende Migration verwendet:

class CreateChallengesSkills < ActiveRecord::Migration
    def up
        create_table :challenges_skills, :id => false do |t|
        t.integer :challenge_id
        t.integer :skill_id
        end
    end

    def down
    drop_table :challenges_skills
    end
end

Und ich verwende den untenstehenden Helper, um die benötigten Fähigkeiten für meine Challenge auszuwählen:

<%= collection_select(:challenge, :skills, Skill.all, :id, :name, {}, {:multiple => "true"}) %>

HTML:

    Pesquisa
    Senso Critico
    Criatividade
    Colaboracao
    Comunicacao
    Proatividade

Hier ist mein Params-Hash:

{"utf8"=>"",
 "authenticity_token"=>"n0ggK8eE7vjh+qY33lYbNLJtZW6Sz7LyM2IRVbAPwhM=",
 "challenge"=>{"description"=>"My description.",
 "skills"=>["", "3", "4"],
 "name"=>"Test Challenge",
 "relevant_content"=>"My relevant_content",
 "solutions"=>"My solutions"},
 "commit"=>"Create Challenge!"
}

Fehler: Skill(#70228688111620) erwartet, aber String(#14953820) erhalten

Das Problem ist, dass ich nicht weiß, wie ich den Skills-Hash verarbeiten soll, um ihn in ein Objektarray innerhalb meiner challenges controller create-Aktion umzuwandeln. Ich weiß, dass es etwas Einfaches sein sollte, aber ich finde keine praktische Lösung. Ich möchte wissen, wie ich den Fähigkeiten-Sammlung mit meiner Challenge-Instanz im Challenges-Controller verknüpfen kann.

ChallengesController#create

def create

    @challenge = Challenge.new(params[:challenge])

    ???

Danke

0voto

David Moritz Punkte 92

Die tatsächliche Antwort ist, "skills" zu deinen akzeptierten Parametern hinzuzufügen:

def approved_params
  params.require(:challenge).permit(
    :name,
    :description,
    ...
    :skills => []
  )
end

dann in deinem Create/Update:

def update
  @controller.update(approved_params)

Das ist alles

-5voto

Michael Durrant Punkte 88734

Mein Rat ist, sich von HABTM fernzuhalten und zu has_many :through zu wechseln. Es wird einfacher zu handhaben sein und flexibler sein, um sich im Laufe der Zeit zu ändern (Attribute hinzuzufügen).

Siehe

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

und

https://stackoverflow.com/a/11601236/631619

und hier ist ein schöner Vergleich der beiden:

http://railscasts.com/episodes/47-two-many-to-many

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X