3 Stimmen

Wie kann ich das Attribut eines Verknüpfungsmodells bei der Erstellung einer Beziehung spontan festlegen?

Ich habe eine has_many :through-Beziehung zwischen Benutzern und Projekten über ein Ownership-Join-Modell. Ich möchte in der Lage sein, ein Attribut des Eigentumsmodells zu setzen, während ich eine Beziehung zwischen einem Benutzer und einem neuen Projekt erstelle. Hier ist, was ich bis jetzt habe:

def create
    @project = Project.new(params[:project])
    if @project.save
      current_user.projects << @project
      flash[:success] = "Project created!"
      redirect_to @project
    else
      flash[:error] = "Project not created."
    end
  end

Im Grunde weiß ich nicht, wie man den Wert "owner_type" im Eigentumsmodell bei der Erstellung eines neuen Projekts für einen bestimmten Benutzer, da ich nicht direkt das Eigentum Join-Modell in der Projekterstellung Controller erwähnen. Wie kann ich das tun?

Hier ist mein Eigentumsmodell (Join):

class Ownership < ActiveRecord::Base
  attr_accessible :owner_type

  belongs_to :project
  belongs_to :user

  validates :user_id, :presence => true

  validates :project_id, :presence => true

  validates :owner_type, :presence => true

end

und mein Benutzermodell:

class User < ActiveRecord::Base
  attr_accessible :name, :email, :admin, :projects

  has_many :ownerships
  has_many :projects, :through => :ownerships

  accepts_nested_attributes_for :projects

und mein Projektmodell:

class Project < ActiveRecord::Base
      attr_accessible :name, :description

      has_many :ownerships
      has_many :users, :through => :ownerships

3voto

sled Punkte 14307

Der Schlüssel ist, dass Sie die Assoziation aufbauen (nicht erstellen), bevor Sie die @project.save Wenn Sie auf "Speichern" klicken, wird das Projekt zuerst persistiert, und wenn es erfolgreich persistiert wurde, wird auch der Eigentümer erstellt.

def create
  @project = Project.new(params[:project])
  @project.ownerships.build(:user => current_user, :owner_type => 'chief')

  if @project.save
    flash[:success] = "Project created!"
    redirect_to @project
  else
    flash[:error] = "Project not created."
  end
end

0 Stimmen

Edit: vielleicht können Sie das Folgende ignorieren, versuchen Sie es einfach so, wie es ist - denn Sie weisen nicht die user_id direkt Entweder entfernen attr_accessible :owner_type oder hinzufügen user_id y project_id auch. Denn wenn Sie die attr_accessible auf ein Attribut, sind alle anderen Attribute durch die Massenzuweisung nicht zugänglich, es sei denn, Sie erklären sie ausdrücklich für zugänglich. Zitat: Wenn irgendwelche Attribute durch attr_protected oder attr_accessible geschützt sind, werden nur einstellbare Attribute zugewiesen.

0 Stimmen

Das hat nicht geklappt. Es wurde kein Fehler ausgelöst, aber es wurde zu /projects umgeleitet, aber es war nicht wirklich die /projects Seite, sondern eine project#create Seite, aber es sah komisch aus. Das Projekt wurde nicht gespeichert, ebenso wenig wie das Eigentumsmodell. Wenn ich @project.ownerships.build(:user => current_user, :owner_type => 'designer') entferne, wird das Projekt wieder ordnungsgemäß erstellt, aber das Eigentumsmodell wird nicht erstellt (offensichtlich). Außerdem habe ich ALL attr_accessible entfernt, nur um zu versuchen, dies zum Laufen zu bringen.

0 Stimmen

Es hat funktioniert! Ich habe Folgendes getan: Ich habe den Build in create geändert und ihn nach der project.save verschoben. Habe deine Antwort entsprechend geändert.

1voto

Matthew Berman Punkte 8311

EDIT: Das hat bei mir nicht wirklich funktioniert.

In meinem Benutzermodell erlaube ich verschachtelte Attribute mit dieser Zeile:

accepts_nested_attributes_for :projects

Dann, in meiner projects#create Controller-Aktion, ich verschachtelt ein Attribut beim Erstellen der Zuordnung zwischen dem Benutzer und das neue Projekt als so:

current_user.ownerships.create(:owner_type => 'designer', :project => @project)

Um ehrlich zu sein, weiß ich nicht genau, warum das funktioniert, aber es funktioniert. Es wäre toll, wenn jemand anderes es erklären könnte.

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