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:
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.
Ich sehe nicht 'Product # name' wird überall verwendet. Erhöht dieser Code jetzt diesen Fehler? –
Hast du 'reload!' In der Konsole gemacht? –
@RajMishra, auch nachdem ich einen Nachlade-Knall mache, bekomme ich immer noch den Fehler. – Ale