2012-05-30 5 views
13

Ich habe alle verwandten Fragen durchgesehen, aber nichts ist neu für mich hier.undefinierte Methode `Modellname 'für Projekt: Klasse

Ich habe ein Projekt-Controller mit „neuen“ Aktion

class ProjectsController < ApplicationController 
    def new 
    @newproject = Project.new 
    end 
end 

Projekt ist eine einfache Klasse, nicht aktiven Datensatz:

class Project 
    attr_accessor :name, :description 
    def initialize 
    @name = "" 
    @description = "" 
    end 
end 

ich den Fehler „nicht definierte Methode` model_name‘erhalten für das Projekt : Klasse“

Dies ist eine erb-Datei Beispiel:

<%= form_tag(@newproject) do |f| %> 
    <%= f.label :name %>: 
    <%= f.text_field :description %><br /> 
<% end %> 

Antwort

29

wenn Projekt keine aktive Datensatz Unterklasse ist, müssen Sie diese und können Sie verwenden form_for

class Project 
    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    def persisted? 
    false 
    end 
    ... 
end 

Ansicht:

<%= form_for(@newproject) do |f| %> 
    <%= f.label :name %>: 
    <%= f.text_field :description %><br /> 
<% end %> 
+0

Viktor, vielen Dank! Es hat mir geholfen. Ich bin einfach dabei geblieben. Vielleicht ist dies nicht der beste Weg, um eine temporäre Instanz zu erstellen, damit der Benutzer ein wirklich aktives Record-Projekt erstellen kann. – Dmitry

+0

Wenn Sie Project jemals beibehalten, verwenden Sie dies nicht, verwenden Sie die Klasse Project

+0

Vielen Dank, große Hilfe. @ ViktorTrón irgendwelche Hinweise, wie Sie mit Rails wissen besser zu erreichen, dass Sie dieses Problem debuggen können? –

3
class Project < ActiveRecord::Base 
+0

In diesem Fall ich bekomme "Konnte Tabelle 'Projekte' nicht finden" – Dmitry

+0

Ich möchte nur eine temporäre Projektinstanz erstellen, so dass ein Benutzer auf der Clientseite neue Parameter bearbeiten konnte, um eine gültige Projektinstanz auf der Serverseite zu erstellen. – Dmitry

+1

oh in diesem Fall Verwenden Sie das neue Objekt der ActiveRecord-persistenten Klasse im Formular. Es ist temporär, da Sie es nicht speichern. Wenn Ihre Klasse niemals beibehalten wird, sehen Sie meine Antwort. –

Verwandte Themen