Donc je travaille sur une application web utilisant des rails et le datastore google cloud. Je suis relativement nouveau dans le codage d'applications Web. La plupart des erreurs que je rencontre viennent d'essayer d'intégrer la banque de données avec le modèle MVC rails. Pour plus de détails, la plupart de mon code est basé sur le didacticiel Bookshelf de Google Datastore disponible sur la page d'informations du magasin de données. J'ai récemment rencontré une erreur NameError dans PostsController # create lorsque j'essayais d'enregistrer un message dans la base de données du magasin de données. Je n'arrive pas à trouver la cause de ce problème alors j'espère que quelqu'un peut être mon nouvel œil ou donner un aperçu.NameError dans PostsController # create
Aussi si vous connaissez des endroits où je peux trouver la documentation utile utilisant la banque de données et les rails. Ce serait apprécié
C'est donc mon fichier post_controller.rb
class PostsController < ApplicationController
PER_PAGE = 10
def index
@post, @cursor = Post.query limit: PER_PAGE, cursor: params[:cursor]
end
def new
@post = Post.new
end
def create
@post = Post.new post_params
if @post.save
flash[:success] = "Posted"
redirect_to posts_path(@post)
else
render :new
end
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
if @post.update(post_params)
redirect_to @post
else
render 'edit'
end
end
def show
@post = Post.find(params[:id])
end
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to posts_path
end
private
def post_params
params.require(:post).permit(:title, :body)
end
end
Ceci est mon modèle pour le post_rb post
require "google/cloud/datastore"
class Post
include ActiveModel::Model
attr_accessor :title, :body
# Return a Google::Cloud::Datastore::Dataset for the configured dataset.
# The dataset is used to create, read, update, and delete entity objects.
def self.dataset
@dataset ||= Google::Cloud::Datastore.new(
project: Rails.application.config.
database_configuration[Rails.env]["dataset_id"]
)
end
# Query Book entities from Cloud Datastore.
#
# returns an array of Book query results and a cursor
# that can be used to query for additional results.
def self.query options = {}
query = Google::Cloud::Datastore::Query.new
query.kind "Post"
query.limit options[:limit] if options[:limit]
query.cursor options[:cursor] if options[:cursor]
results = dataset.run query
posts = results.map {|entity| Post.from_entity entity }
if options[:limit] && results.size == options[:limit]
next_cursor = results.cursor
end
return posts, next_cursor
end
# [START from_entity]
def self.from_entity entity
post = Post.new
post.id = entity.key.id
entity.properties.to_hash.each do |name, value|
post.send "#{name}=", value if post.respond_to? "#{name}="
end
post
end
# [END from_entity]
# [START find]
# Lookup Book by ID. Returns Book or nil.
def self.find id
query = Google::Cloud::Datastore::Key.new "Post", id.to_i
entities = dataset.lookup query
from_entity entities.first if entities.any?
end
# [END find]
# [START validations]
# Add Active Model validation support to Book class.
include ActiveModel::Validations
validates :title, presence: true
# [END validations]
# Save the book to Datastore.
# @return true if valid and saved successfully, otherwise false.
def save
if valid?
entity = to_entity
Post.dataset.save entity
self.id = entity.key.id
true
else
false
end
end
end
Ceci est mon new.html. fichier erb que j'utilise pour appeler la méthode de sauvegarde dans la banque de données
<h1>Create Post</h1>
<%= form_for @post do |f| %>
<% if @post.errors.any? %>
<% @post.errors.full_messages.each do |msg| %>
<div class="alert alert danger"><%= msg %></div>
<% end %>
<% end %>
<div class="form-group">
<%= f.label:title %><br>
<%= f.text_field(:title, {:class => 'form-control'}) %>
</div>
<div class="form-group">
<%= f.label:body %><br>
<%= f.text_area(:body, {:class => 'form-control'}) %>
</div>
<p>
<%= f.submit({:class => 'btn btn-primary'}) %>
</p>
<% end %>
Ceci est mon fichier routes.rb
Rails.application.routes.draw do
get 'auth/:provider/callback', to: 'sessions#create'
get 'auth/failure', to: redirect('/')
get 'signout', to: 'sessions#destroy', as: 'signout'
resources :sessions, only: [:create, :destroy]
resource :main, only: [:show]
resources :posts
root to: 'posts#index', as: "home"
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
EDIT: Vous avez oublié d'inclure le message d'erreur journal
NameError (undefined local variable or method `to_entity' for #<Post:0x65b0d70>
Did you mean? to_key):
app/models/post.rb:72:in `save'
app/controllers/posts_controller.rb:16:in `create'
REMARQUE: Le create.html.erb est vide si je choisis ne pas l'inclure
Veuillez publier le message d'erreur complet, y compris le nom de fichier et le numéro de ligne dans lequel l'erreur s'est produite. La trace de pile peut également être utile. – spickermann