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 %>
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
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
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