2017-07-19 21 views
-1

Also habe ich eine App mit Rails und dem Google Datastore erstellt. Ich erhalte immer wieder einen Fehler in meiner Datei new.html.erb, wo ich NoMethodError erhalte.RoR NoMethodError in Posts # neu

Ich habe nach einer Lösung für mein Problem gesucht und es ist wahrscheinlich ein einfacher Tippfehler irgendwo in meinem Code. Ich habe stundenlang auf den Code gestarrt so vielleicht ein paar neue, frische Augen kann mir es helfen herauszufinden,

Das ist mein 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 

Das ist mein 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 %> 

Das ist mein Modell 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: Dies ist das Fehlerprotokoll, das ich erhalte

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

Bitte senden Sie das Fehlerprotokoll –

+0

Es gibt eine Menge von nicht verwandten Code hier. Ich schlage vor, Sie versuchen, ein einfacheres Beispiel zu finden, das denselben Fehler erzeugt. –

Antwort

1

Ihr Post Modell ist ein einfaches Ruby-Objekt, aber Sie behandeln es wie ein ActiveModel/ActiveRecord-Objekt.

Versuchen Zugabe

include ActiveModel::Model innerhalb des Post Modell wie folgt:

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

Vielen Dank. Das hat es funktioniert. Du hast meinen Tag gemacht –

+0

@KaodilichiNwuda Wenn die Antwort dein Problem löst, markiere es bitte als die akzeptierte Antwort für deine Frage. –

1

Sie haben @posts in new Methode definiert, aber Sie verwenden @post in die new.html.erb. Welches ist der Grund für den Fehler. Halten Sie den gleichen Namen entweder @posts oder @post

+0

Ich gehe davon aus, dass Sie Posts in der Index-Methode zu posten bedeutet. Post ist das gleiche in der Steuerung und der new.html.erb-Datei. Ich bekomme immer noch den gleichen Fehler –

+0

@KaodilichiNwuda Können Sie die Frage mit voller Fehlermeldung aktualisieren? – Pavan

+0

@KoodilichiNwuda Sie haben '@ Beiträge' in' neuer' Methode. Ändern Sie es in '@ post' und überprüfen Sie erneut – Pavan