2017-09-15 1 views
-1

Ich habe einWoher kommt die undefinierte Methode von `name`?

rails g migration add_position_to_products position:integer 

mir die Logik von Let erklären, was ich hier tue. Damit mein System wissen kann, in welcher Reihenfolge die Elemente eingefügt werden sollen, brauche ich einen Referenzrahmen, ein Attribut in der Datenbank, das gespeichert werden kann, wo ich sagen kann. Sie sehen diese Position genau hier. Diese Nummer ist die Reihenfolge, die ich habe möchte, dass du die Sortierung anlegst.

Below biete ich ein bisschen ein visuelles:

enter image description here

Wenn ich also die Positionsnummer für diese Radish festlegen möchten schießt Artikel bis 5, dann würde ich die Radieschen Sprossen an der Position zu sein, erwarten 5 in den Bildern unten also fünf Blocks weiter unten wo es jetzt ist. Ich möchte, dass dieses System funktioniert, wenn ich auf das Element klicke und es an eine andere Position verschiebe. Ich möchte, dass das System diesen Positionswert dynamisch ändert.

Also die Schienen Migration oben bin ich erstellen das Element in der Datenbank für die Position.

Ich habe eine

rails db:migrate 

Dann brauchte ich einen Rahmen zu schaffen. Ich ging zu Products und legte sie in der Index Aktion:

class ProductsController < ApplicationController 
    before_action :set_product, only: [:show, :edit, :update, :destroy] 
    layout 'product' 
    access all: [:show, :index], user: {except: [:destroy, :new, :create, :update, :edit]}, site_admin: :all 

    # GET /products 
    # GET /products.json 
    def index 
    @products = Product.order("position ASC") 
    @products = Product.page(params[:page]).per(9) 
    @page_title = "Products" 
    end 

    # GET /products/1 
    # GET /products/1.json 
    def show 
    @page_title = @product.summary 
    @seo_keywords = @product.description 
    end 

    # GET /products/new 
    def new 
    @product = Product.new 
    end 

    # GET /products/1/edit 
    def edit 
    end 

    # POST /products 
    # POST /products.json 
    def create 
    @product = Product.new(product_params) 

    respond_to do |format| 
     if @product.save 
     format.html { redirect_to @product, notice: 'Product was successfully created.' } 
     format.json { render :show, status: :created, location: @product } 
     else 
     format.html { render :new } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /products/1 
    # PATCH/PUT /products/1.json 
    def update 
    respond_to do |format| 
     if @product.update(product_params) 
     format.html { redirect_to @product, notice: 'Product was successfully updated.' } 
     format.json { render :show, status: :ok, location: @product } 
     else 
     format.html { render :edit } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /products/1 
    # DELETE /products/1.json 
    def destroy 
    @product.destroy 
    respond_to do |format| 
     format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_product 
     @product = Product.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def product_params 
     params.require(:product).permit(:summary, :description, :image, :user) 
    end 
end 

Also, was die oben im Index Aktion sollte tun aussehen ist für die Position Attribut in der Produkte-Datenbank-Tabelle und die Elemente der Reihenfolge auf dem niedrigsten Start und ging zu den höchsten.

So weit so gut.

Allerdings, wenn ich in meiner Rails-Konsole gehen, gehe ich Product.last ich eine Null-Position erhalten:

Product Load (0.1ms) SELECT "products".* FROM "products" ORDER BY "products"."id" DESC LIMIT ? [["LIMIT", 1]] 
=> #<Product id: 6, summary: "one more", description: "one more product", image: "abstract-1851074_1280.jpg", created_at: "2017-09-12 19:59:13", updated_at: "2017-09-12 19:59:13", user_id: nil, active: nil, price: nil, position: nil> 

Wenn ich tun:

2.3.3 :002 > Product.last.update!(position: 1) 

ich diesen Fehler:

NoMethodError: undefined method `name' for #<Product:0x007ff4e7aa82a8> 

Und ich weiß nicht, wo diese undefinierte Methode von name ist, weil wir Product.summary zu geändert hatten Product.name zuvor, aber ich habe festgestellt, dass es Dinge gebrochen hat. Also habe ich es zurück in Product.summary geändert. Was für eine undefinierte Methode von name bezieht es sich auf? Hier

ist die schema.rb Datei:

ActiveRecord::Schema.define(version: 20170915143515) do 

    create_table "carts", force: :cascade do |t| 
    t.integer "user_id" 
    t.integer "product_id" 
    t.integer "quantity" 
    t.float "subtotal" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.index ["product_id"], name: "index_carts_on_product_id" 
    t.index ["user_id"], name: "index_carts_on_user_id" 
    end 

    create_table "categories", force: :cascade do |t| 
    t.string "name" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "homes", force: :cascade do |t| 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "products", force: :cascade do |t| 
    t.string "summary" 
    t.text  "description" 
    t.string "image" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "user_id" 
    t.boolean "active" 
    t.float "price" 
    t.integer "position" 
    t.index ["user_id"], name: "index_products_on_user_id" 
    end 

    create_table "users", force: :cascade do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "name" 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.string "roles" 
    t.index ["email"], name: "index_users_on_email", unique: true 
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 
    end 

end 

Dies ist die Modelle/product.rb Datei:

class Product < ApplicationRecord 
belongs_to :user 
validates :user , presence: true 
mount_uploader :image, ImageUploader 


    has_and_belongs_to_many :categories 


validates :summary, :price, presence: true 

    has_and_belongs_to_many :categories 

end 

In Konsole sehe ich, dass es eine user_id ist: und Preis: dass ist Null und das kann nicht Null sein, wie du über Präsenz siehst: wahr.

Ich habe diese Features nicht entwickelt, sieht aus wie sie gemacht wurden, nachdem ich die Bearbeitungsformulare entwickelt habe. An dieser Stelle bin ich mir nicht sicher, wie ich hier bei Stack Overflow vorgehen soll. Der Fehler/das Problem hat sich jetzt geändert, bitte berate.Ich denke, ich könnte Jacobs Antwort als die richtige markieren, da ich durch die Erwähnung des Produktmodells herausgefunden habe, warum ich eine undefinierte Namensmethode bekommen habe.

+0

Ich sehe nicht 'Product # name' wird überall verwendet. Erhöht dieser Code jetzt diesen Fehler? –

+0

Hast du 'reload!' In der Konsole gemacht? –

+0

@RajMishra, auch nachdem ich einen Nachlade-Knall mache, bekomme ich immer noch den Fehler. – Ale

Antwort

1

Can you post your Product model?

Ich bin froh, dass meine Frage zu Ihnen führte, eine Lösung zu finden! Nur für den Fall jemand auf dieser Seite kommt später, ich werde versuchen, die Lösung zusammenzufassen, die für sich selbst gefunden @Ale ...

ursprüngliche product.rb:

class Product < ApplicationRecord 
belongs_to :user 
validates :user , presence: true 
mount_uploader :image, ImageUploader 


    has_and_belongs_to_many :categories 


validates :name, :price, presence: true 

    has_and_belongs_to_many :categories 

end 

aktualisiert Produkt. rb:

class Product < ApplicationRecord 
belongs_to :user 
validates :user , presence: true 
mount_uploader :image, ImageUploader 


    has_and_belongs_to_many :categories 


validates :summary, :price, presence: true 

    has_and_belongs_to_many :categories 

end 
+0

@Ale Bitte lassen Sie mich wissen, wenn ich inhaltlich falsch über den ursprünglichen Dateiinhalt bin und ich werde aktualisieren. –