2012-11-01 8 views
6

Ich versuche verschachtelte Felder mit mongodb zu erstellen. Dafür verwende ich den Edelstein mongomodel, der die Arbeit mit Ruby und Mongodb erlaubt und ich benutze den Edelstein nested_form, um verschachtelte dynamische Felder zu erstellen. Ich habe folgendes Problem:Verschachtelte Felder mit mongodb

undefined method reflect_on_association‘für #`

Andere Fehler, wie es, dass ich im Internet gefunden haben, nicht wirklich dem entsprechen, was ich hier mit mongodb tun wollen. Ich bin neu in RoR und ich weiß nicht, wie ich das lösen soll. Kann mir jemand helfen?

Hier ist meine Modelle:

survey.rb

class Survey < MongoModel::Document 
    property :name, String 
    property :questions, Collection[Question] 
    timestamps! 

    accepts_nested_attributes_for :questions, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true 
end 

questions.rb

class Question < MongoModel::Document 
    property :content, String 
    timestamps! 
end 

Mein Controller:

surveys_controller.rb 
class SurveysController < ApplicationController 
    # GET /surveys 
    # GET /surveys.json 
    def index 
    @surveys = Survey.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @surveys } 
    end 
    end 

    # GET /surveys/1 
    # GET /surveys/1.json 
    def show 
    @survey = Survey.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @survey } 
    end 
    end 

    # GET /surveys/new 
    # GET /surveys/new.json 
    def new 
    @survey = Survey.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @survey } 
    end 
    end 

    # GET /surveys/1/edit 
    def edit 
    @survey = Survey.find(params[:id]) 
    end 

    # POST /surveys 
    # POST /surveys.json 
    def create 
    @survey = Survey.new(params[:survey]) 

    respond_to do |format| 
     if @survey.save 
     format.html { redirect_to @survey, notice: 'Survey was successfully created.' } 
     format.json { render json: @survey, status: :created, location: @survey } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @survey.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /surveys/1 
    # PUT /surveys/1.json 
    def update 
    @survey = Survey.find(params[:id]) 

    respond_to do |format| 
     if @survey.update_attributes(params[:survey]) 
     format.html { redirect_to @survey, notice: 'Survey was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @survey.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /surveys/1 
    # DELETE /surveys/1.json 
    def destroy 
    @survey = Survey.find(params[:id]) 
    @survey.destroy 

    respond_to do |format| 
     format.html { redirect_to surveys_url } 
     format.json { head :no_content } 
    end 
    end 
end 

Mein gemfile:

source 'https://rubygems.org' 

gem 'rails', '3.2.8' 

# Bundle edge Rails instead: 
# gem 'rails', :git => 'git://github.com/rails/rails.git' 

gem "mongomodel" 
gem "bson_ext" 
gem "nested_form" 

# Gems used only for assets and not required 
# in production environments by default. 
group :assets do 
    gem 'sass-rails', '~> 3.2.3' 
    gem 'coffee-rails', '~> 3.2.1' 

    # See https://github.com/sstephenson/execjs#readme for more supported runtimes 
    # gem 'therubyracer', :platforms => :ruby 

    gem 'uglifier', '>= 1.0.3' 
end 

gem 'jquery-rails' 

# To use ActiveModel has_secure_password 
# gem 'bcrypt-ruby', '~> 3.0.0' 

# To use Jbuilder templates for JSON 
# gem 'jbuilder' 

# Use unicorn as the app server 
# gem 'unicorn' 

# Deploy with Capistrano 
# gem 'capistrano' 

# To use debugger 
# gem 'debugger' 

Meine Sicht der Umfrage:

_form.html.erb 
<%= nested_form_for(@survey) do |f| %> 
    <% if @survey.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@survey.errors.count, "error") %> prohibited this survey from being saved:</h2> 

     <ul> 
     <% @survey.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <p> 
    <%= f.fields_for :questions do |builder| %> 
    <p> 
     <%= builder.label :content, "Question" %> 
    <%= builder.text_area :content, :rows => 3 %> 
    </p>  
    <% end %> 
    <p><%= f.link_to_add "Add a Question", :questions %></p> 
    </p> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 
+0

Die Basisschienen, die ich verwendet habe, ist [Railscast 196] (http://railscasts.com/episodes/196-nested-model-form-part-1). Der zweite Teil verwendet die Methode reflect_on_association und wird das gleiche Problem ergeben, dem ich mit dem gem nested_form gegenüberstehe. – lucianthomaz

+0

Ich habe bekommen, was ich wollte, indem ich den Edelstein [Mongoid] (http://mongoid.org/en/mongoid/index.html) benutze. Ich dachte, dass es nicht möglich ist, aber ich habe mich geirrt. Mongoid hat perfekt gemacht, was ich zu tun versuchte, viel einfacher als Mongomodel und ohne Probleme. – lucianthomaz

+2

Fügen Sie Ihre Lösung als Antwort auf Ihre Frage hinzu, anstatt sie nur in einen Kommentar zu schreiben. Dann können Sie auch Ihre Antwort akzeptieren und die Frage richtig abschließen. – JohnnyHK

Antwort

1

Ich habe versucht, diese railscast zu folgen, aber ich wollte mit mongodb arbeiten, und ich wurde mit der Perle mongomodel das zu tun. Ich konnte nicht tun, was ich wollte, weil ich den oben beschriebenen Fehler hatte, und sogar für den Knopf "Entfernen" bekam ich einen weiteren Fehler, an den ich mich jetzt nicht erinnern kann. Was auch immer, ich konnte wirklich nicht tun, was ich wollte mit Mongomodel, also habe ich versucht, das mit mongoid zu tun, und alles war einfacher.

Verwandte Themen