2017-07-19 4 views
-1

Donc j'ai construit une application en utilisant des rails et la banque de données google. Je continue à rencontrer une erreur dans mon nouveau fichier.html.erb où j'obtiens le NoMethodError.RoR NoMethodError dans les messages # new

J'ai cherché une solution à mon problème et c'est probablement une simple faute de frappe quelque part dans mon code. Je suis les yeux fixés sur le code pendant des heures alors peut-être quelques frais nouveaux yeux peuvent me aider à sortir

Ceci est mon posts_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 new.html.erb

 <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 modèle post.rb

class Post 
    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| Book.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 

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: Ceci est le journal des erreurs que je reçois

ActionView::Template::Error (undefined method `to_key' for #<Post:0x2ae2c68> 
Did you mean? to_query): 
    1: <h1>Create Post</h1> 
    2: <%= form_for @post do |f| %> 
    3:  <% if @post.errors.any? %> 
    4:   <% @post.errors.full_messages.each do |msg| %> 
    5:    <div class="alert alert danger"><%= msg %></div> 

app/views/posts/new.html.erb:2:in `_app_views_posts_new_html_erb__241418705_22466964' 
+0

S'il vous plaît poster le journal –

+0

d'erreur Il y a beaucoup de code sans lien ici. Je vous suggère d'essayer de trouver un exemple plus simple qui produit la même erreur. –

Répondre

1

Votre modèle Post est un objet ruby ​​simple, mais vous le traitez comme un objet ActiveModel/ActiveRecord.

Essayez d'ajouter

include ActiveModel::Model à l'intérieur du modèle Post comme ceci:

class Post 
    include ActiveModel::Model 
    ... 
end 
+0

Merci. Cela a fait fonctionner. Vous avez fait ma journée –

+0

@KaodilichiNwuda Si la réponse résout votre problème, veuillez le marquer comme la réponse acceptée pour votre question. –

1

Vous avez défini @posts dans new méthode, mais que vous utilisez dans @post le new.html.erb. Quelle est la raison de l'erreur. Conservez le même nom, soit @posts ou @post

+0

Je suppose que vous vouliez dire changer de poste dans la méthode d'index pour poster. La publication est la même dans le contrôleur et dans le fichier new.html.erb. Je reçois toujours la même erreur –

+0

@KaodilichiNwuda Pouvez-vous mettre à jour la question avec un message d'erreur complet? – Pavan

+0

@KaodilichiNwuda Vous avez '@ posts' dans la méthode' new'. Changez-le en '@ post' et vérifiez à nouveau – Pavan