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 %>
Đườ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
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
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