मैंने एक कुर्सी बेचने वाली वेबसाइट बनाई है, फिलहाल मैं एक कुर्सी पोस्ट को संपादित करना चाहता हूं, इससे कोई फर्क नहीं पड़ता कि इसे किसने पोस्ट किया है। हालांकि यह शून्य के लिए 'अपरिभाषित विधि' model_name 'त्रुटि के साथ आ रहा है: NilClass'। यकीन नहीं है कि क्यों। मैंने संपादन फ़ॉर्म में केवल @chair के साथ प्रयास किया। मैंने नीचे दिए गए मॉडल और टर्मिनल से कुछ और कोड जोड़े हैं।

Started GET "/chairs/1/edit" for 127.0.0.1 at 2018-11-27 20:30:53 +0000
Processing by ChairsController#edit as HTML
  Parameters: {"id"=>"1"}
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 3], ["LIMIT", 1]]
  ↳ /Users/benherring/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  Rendering chairs/edit.html.erb within layouts/application
  Rendered chairs/edit.html.erb within layouts/application (3.4ms)
Completed 500 Internal Server Error in 22ms (ActiveRecord: 0.4ms)



ActionView::Template::Error (undefined method `model_name' for nil:NilClass):
    1: <%= simple_form_for @chair do |f| %>
    2: <%= f.input :name %>
    3: <%= f.input :description %>
    4: <%= f.submit :submit %>

app/views/chairs/edit.html.erb:1:in `_app_views_chairs_edit_html_erb___2826282127562707280_70360397910180' . 
class Chair < ApplicationRecord
  belongs_to :user
end



class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
         has_many :chairs
end
class ChairsController < ApplicationController

  def index
    @chairs = Chair.all
  end

  def show
    @chair = Chair.find(params[:id])
    @user = @chair.user
  end

  def new
    @chair = Chair.new
    @user = current_user
  end

  def create
    @user = current_user
    @chair = Chair.new(chair_params)
    @chair.user = @user
    if @chair.save
      redirect_to chairs_path
    end

    def edit
      @chair = Chair.find(params[:id])
      @user = current_user
    end

    def update

    @chair = Chair.find(params[:id])
    @chair.update(chair_params)
    redirect_to chairs_path
    end

    def delete
    end

  end


  private

  def chair_params
    params.require(:chair).permit(:name, :description)
  end
end
<%= simple_form_for [@user, @chair] do |f| %>
<%= f.input :name %>
<%= f.input :description %>
<%= f.submit :submit %>
<% end %>
1
b.herring 27 नवम्बर 2018, 23:10

1 उत्तर

सबसे बढ़िया उत्तर

आप शायद nil से simple_form_for पास कर लें। मुझे नहीं पता कि यह कैसे होता है, मुझे कुछ अजीब चीजों का वर्णन करने दें जो मुझे पता चला है:

आपने नियंत्रक में विधियों का गलत नेस्टिंग किया है - #edit, #update और #delete create में नेस्टेड हैं। या तो आपने इसे कॉपी करते समय गलती की थी, या आपके पास वास्तव में अजीब कोड का एक टुकड़ा है।

लॉग दिखाते हैं कि उपयोगकर्ता डीबी से लाया गया है, लेकिन कुर्सी के बारे में कुछ भी नहीं है। शायद यही इस व्यवहार का कारण है - @chair को इनिशियलाइज़ नहीं किया गया है।

डिबगिंग को आगे बढ़ाने के लिए मैं दो चीजें करूंगा:

  • तरीकों के घोंसले की जाँच करें।
  • सुनिश्चित करें कि ChairsController दो बार परिभाषित नहीं है
  • जांचें कि क्या @chair @edit में शून्य नहीं है (उदाहरण के लिए, @chair.id को लॉग में प्रिंट करके)।
1
mrzasa 27 नवम्बर 2018, 22:09