1

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

+1

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

Répondre

1

D'accord, il semble qu'il vous manque une méthode to_entity. Essayez d'ajouter quelque chose de similaire à ceci pour votre modèle de message. J'ai légèrement modifié le code de l'exemple de documentation Bookhere. Vous voudrez lire tout ce fichier pour voir à quoi ressemble leur modèle Book avec tout le code.

def to_entity 
    entity     = Google::Cloud::Datastore::Entity.new 
    entity.key    = Google::Cloud::Datastore::Key.new "Post", id 
    entity["title"]  = title 
    entity["body"]   = body 
    entity 
end 
+0

Eh bien, en fait, je ne peux pas utiliser ActiveRecord parce qu'il est en conflit avec les configurations de base de données nosql. Donc je ne l'ai pas inclus quand j'ai créé l'application. –

+0

J'ai effectué ma réponse maintenant que vous avez publié une pile trace – Dbz

+0

NameError (variable locale non définie ou méthode 'id 'pour # ): app/modèles/post.rb: 40: dans' to_entity' application /models/post.rb:80:in 'save ' app/controllers/posts_controller.rb: dans' create' –