2012-11-01 20 views
6

Tôi đang cố gắng tạo các trường lồng nhau bằng cách sử dụng mongodb. Đối với điều đó tôi đang sử dụng đá quý mongomodel cho phép làm việc với ruby ​​và mongodb và tôi đang sử dụng đá quý nested_form, để tạo các trường lồng nhau động. Tôi đang gặp những rắc rối sau:Các trường được lồng với mongodb

undefined method reflect_on_association' cho #'

lỗi khác như nó, mà tôi đã tìm thấy trong internet không thực sự phù hợp với những gì tôi muốn làm ở đây với MongoDB. Tôi mới làm quen với RoR và tôi không biết cách giải quyết vấn đề này. Ai giúp tôi với?

Đây là mô hình của tôi:

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 

điều khiển của tôi:

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 

gemfile của tôi:

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' 

Quan điểm của tôi khảo sát:

_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

Đường ray cơ sở truyền mà tôi đã sử dụng là [railscast 196] (http://railscasts.com/episodes/196-nested-model-form-part-1). Phần thứ hai sẽ sử dụng phương thức reflect_on_association, và sẽ cung cấp cho cùng một vấn đề mà tôi đang gặp phải với gem nested_form. – lucianthomaz

+0

Tôi nhận được những gì tôi muốn bằng cách sử dụng gem [mongoid] (http://mongoid.org/en/mongoid/index.html). Tôi nghĩ rằng điều đó là không thể, nhưng tôi đã sai. Mongoid đã làm hoàn hảo những gì tôi đang cố gắng làm, dễ dàng hơn nhiều so với mongomodel và không gặp rắc rối nào. – lucianthomaz

+2

Thêm giải pháp của bạn làm câu trả lời cho câu hỏi của bạn thay vì chỉ đưa câu trả lời đó vào nhận xét. Sau đó, bạn cũng có thể chấp nhận câu trả lời của bạn và đóng đúng câu hỏi. – JohnnyHK

Trả lời

1

Tôi đã cố gắng để làm theo railscast này, nhưng tôi muốn làm việc với MongoDB, và tôi đã sử dụng đá quý mongomodel để làm điều đó. Tôi đã không thể làm những gì tôi muốn bởi vì tôi đã nhận được lỗi mô tả ở trên, và ngay cả đối với các nút "Hủy bỏ" tôi đã nhận một lỗi mà tôi không thể nhớ bây giờ. Dù sao, tôi thực sự không thể làm những gì tôi muốn bằng cách sử dụng mongomodel, vì vậy tôi đã cố gắng làm điều đó bằng cách sử dụng mongoid và mọi thứ trở nên dễ dàng hơn.

Các vấn đề liên quan