2016-09-26 2 views
2

Ich habe diese undefinierte Methode" name ", Es funktioniert, obwohl ... Ich weiß nicht, was ich vermasselt ... ich brauche Ihre Hilfe bitte ...Ich habe eine undefinierte Methode `name` für nil: NilClass, aber ich habe gearbeitet

index.html.slim

.container 
    .row 
    .col-xs-12 
     h1.text-gray Tutorials 
     h4 Search by Title 
     =form_tag tutos_path, :method => 'get' do 
     =text_field_tag :search, params[:search] 
     =submit_tag "Search", class:'btn btn-default' 

    .col-xs-12 
     -if user_signed_in? 
     = link_to "Create a tuto", new_tuto_path, class:"btn btn-success" 


#tutos.transitions-enabled 
    [email protected] do |tuto| 
    .box.panel-default 
     -if tuto.category.name == "Ruby" 
     = link_to(image_tag("select/ruby.png"), tuto_path(tuto)) 
     -elsif tuto.category.name == "Rails 4" 
     = link_to(image_tag("select/rails4.png"), tuto_path(tuto)) 
     -elsif tuto.category.name == "Rails 5" 
     = link_to(image_tag("select/rails5.png"), tuto_path(tuto)) 
     -elsif tuto.category.name == "Heroku" 
     = link_to(image_tag("select/heroku.png"), tuto_path(tuto)) 
     -elsif tuto.category.name == "AWS-Amazon" 
     = link_to(image_tag("select/aws.png"), tuto_path(tuto)) 


     h3 = link_to tuto.title, tuto_path(tuto), class:"title-link"  
     h6 
     | Created by: 
     span<> 
     = tuto.user.full_name 
     br 
     span.glyphicon.glyphicon-heart 
     span<> 
     = tuto.get_upvotes.size 
     br 
     br 

Meine Kategorien werden in der Konsole erstellt:

Category Load (1.4ms) SELECT "categories".* FROM "categories" 
=> #<ActiveRecord::Relation [#<Category id: 1, name: "Ruby", created_at: "2016-09-26 09:03:17", updated_at: "2016-09-26 09:03:17">, #<Category id: 2, name: "Rails 4", created_at: "2016-09-26 09:03:25", updated_at: "2016-09-26 09:03:25">, #<Category id: 3, name: "Rails 5", created_at: "2016-09-26 09:03:30", updated_at: "2016-09-26 09:03:30">, #<Category id: 4, name: "Heroku", created_at: "2016-09-26 09:03:35", updated_at: "2016-09-26 09:03:35">, #<Category id: 5, name: "AWS-Amazon", created_at: "2016-09-26 09:03:43", updated_at: "2016-09-26 09:03:43">]> 
2.3.1 :002 > 

tutos_controller.rb

class TutosController < ApplicationController 
    before_action :authenticate_user!, only: [:new, :create] 
    before_action :set_tuto, only: [:show, :edit, :update, :destroy, :upvote] 


    def index 
    @tutos = Tuto.all.includes(:user && :category) 
    @categories = Category.all 
    keyword_search 
    end 

    def show 
    @tuto = Tuto.find(params[:id]) 
    @user = User.all 
    end 


    def new 
    @tuto = Tuto.new 
    end 

    def edit 
    end 

    def create 

    @tuto = Tuto.new(tuto_params) 
    @tuto.user_id = current_user.id 

    respond_to do |format| 
     if @tuto.save 
     flash[:success] = "Test" 
     format.html { redirect_to @tuto, notice: 'Tuto was successfully created.' } 
     format.json { render :show, status: :created, location: @tuto } 
     else 
     format.html { render :new } 
     format.json { render json: @tuto.errors, status: :unprocessable_entity } 
     end 
    end 
    end 


    def update 
    respond_to do |format| 
     if @tuto.update(tuto_params) 
     format.html { redirect_to @tuto, notice: 'Tuto was successfully updated.' } 
     format.json { render :show, status: :ok, location: @tuto } 
     else 
     format.html { render :edit } 
     format.json { render json: @tuto.errors, status: :unprocessable_entity } 
     end 
    end 
    end 


    def destroy 
    @tuto.destroy 
    respond_to do |format| 
     format.html { redirect_to tutos_url, notice: 'Tuto was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 


    def upvote 
    @tuto.upvote_by current_user 
    redirect_to :back 
    end 


    def keyword_search 
    @tutos = Tuto.search(params[:search]) 
    end 

    private 

    def set_tuto 
     @tuto = Tuto.find(params[:id]) 
    end 

    def tuto_params 
     params.require(:tuto).permit(:title, :content, :id, :user_id, :category_id) 
    end 
end 

Das Schema

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

    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 "tutos", force: :cascade do |t| 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.string "title" 
    t.text  "content" 
    t.integer "user_id" 
    t.integer "category_id" 
    end 

    add_index "tutos", ["user_id"], name: "index_tutos_on_user_id" 

    create_table "users", force: :cascade do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    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 "first_name" 
    t.string "last_name" 
    t.boolean "admin" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 

    create_table "votes", force: :cascade do |t| 
    t.integer "votable_id" 
    t.string "votable_type" 
    t.integer "voter_id" 
    t.string "voter_type" 
    t.boolean "vote_flag" 
    t.string "vote_scope" 
    t.integer "vote_weight" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "votes", ["votable_id", "votable_type", "vote_scope"], name: "index_votes_on_votable_id_and_votable_type_and_vote_scope" 
    add_index "votes", ["voter_id", "voter_type", "vote_scope"], name: "index_votes_on_voter_id_and_voter_type_and_vote_scope" 

end 

tuto_model.rb

class Tuto < ActiveRecord::Base 
    acts_as_votable 
    belongs_to :user 
    belongs_to :category 
    validates :category_id, presence: true 


    def self.search(search) 
    if search 
     where(["title LIKE ?","%#{search}%"]) 
    else 
     all 
    end 
    end 
end 

category_model.rb

class Category < ActiveRecord::Base 
    has_many :tutos 
end 

bearbeiten

dies ist der Fehler, den ich mit deepak Vorschlag haben, (BTW ich wirklich wie die refactoing schlug er vor !!)

index.html.slim:29: syntax error, unexpected ';', expecting ')' ...temple_html_pretty1)))).to_s)); ...^

Extracted source (around line #29): 
27 
28 
29 
30 
31 
32 

    [email protected] do |tuto| 
    .box.panel-default 
     = link_to image_tag(image_by_category(tuto.category.try(:name)), tuto_path(tuto) 


     h3 = link_to tuto.title, tuto_path(tuto), class:"title-link" 
+0

Wahrscheinlich hat Ihr '@ tuto' keine zugehörige Kategorie. Vielleicht können Sie den StackTrace und den Wert von '@ tuto' zeigen? –

Antwort

1

Tuto.all.includes (: user & &: Kategorie)

Sollte

Tuto.all.includes(:user, :category) 
2

Einer der Kategorie ist nil das ist, warum Sie

nicht definierte Methode "name" für Null bekommen: NilClass

Verwenden try

index.html.slim

[email protected] do |tuto| 
    .box.panel-default 
    -if tuto.category.try(:name) == "Ruby" 
     = link_to(image_tag("select/ruby.png"), tuto_path(tuto)) 
    -elsif tuto.category.try(:name) == "Rails 4" 
     = link_to(image_tag("select/rails4.png"), tuto_path(tuto)) 
    -elsif tuto.category.try(:name) == "Rails 5" 
     = link_to(image_tag("select/rails5.png"), tuto_path(tuto)) 
    -elsif tuto.category.try(:name) == "Heroku" 
     = link_to(image_tag("select/heroku.png"), tuto_path(tuto)) 
    -elsif tuto.category.try(:name) == "AWS-Amazon" 
     = link_to(image_tag("select/aws.png"), tuto_path(tuto)) 

Auch werde ich vorschlagen Verwendung von Helfer-Methode in Ihrem Code

index.html.slim

[email protected] do |tuto| 
    .box.panel-default 
    = link_to image_tag(image_by_category(tuto.category.try(:name))), tuto_path(tuto) 

application_helper zu machen.rb

def image_by_category(name) 
    images = { 
    "Ruby" => "select/ruby.png", 
    "Rails 4" => "select/rails4.png", 
    "Rails 5" => "select/rails5.png", 
    "Heroku" => "select/heroku.png", 
    "AWS-Amazon" => "select/aws.png" 
    } 
    images[name] 
end 
+0

Oder, ja. :) –

+0

danke dafür versuche ich, sollte es zwischen jeder Zeile komas geben? Es wirft mir einen Fehler ... def image_by_category (name) images = { "Ruby" => "wählen/ruby.png", "Schienen 4" => "select/rails4.png", "Rails 5 "=>" select/rails5.png ", " Heroku "=>" Wählen Sie/heroku.png ", " AWS-Amazon "=>"/aws.png " } Bilder [Name] Ende –

+0

@Johan: Ja, es sollte Kommas geben :) –

1

In dieser Schleife @tutos, einer Ihrer Kategorien vorhanden ist oder Null nicht, so Name Methode nicht vorhanden für null ist und werfen Sie einen Fehler, denn dies ist, können Sie es auf zwei Arten lösen.

1) Prüfen, ob die Kategorie am Start der Schleife vorhanden ist, wenn vorhanden, dann nur in gehen,

[email protected] do |tuto| 
    .box.panel-default 
    -if tuto.category.present? 
     -if tuto.category.name == "Ruby" 
     = link_to(image_tag("select/ruby.png"), tuto_path(tuto)) 
     -elsif tuto.category.name == "Rails 4" 
     = link_to(image_tag("select/rails4.png"), tuto_path(tuto)) 
     -elsif tuto.category.name == "Rails 5" 
     = link_to(image_tag("select/rails5.png"), tuto_path(tuto)) 
     -elsif tuto.category.name == "Heroku" 
     = link_to(image_tag("select/heroku.png"), tuto_path(tuto)) 
     -elsif tuto.category.name == "AWS-Amazon" 
     = link_to(image_tag("select/aws.png"), tuto_path(tuto)) 

2) Verwenden try die Ausführung fortgesetzt wird, ohne die Fehlerprüfung

[email protected] do |tuto| 
    .box.panel-default 
     -if tuto.try(:category).try(:name) == "Ruby" 
     = link_to(image_tag("select/ruby.png"), tuto_path(tuto)) 
     -elsif tuto.try(:category).try(:name) == "Rails 4" 
     = link_to(image_tag("select/rails4.png"), tuto_path(tuto)) 
     -elsif tuto.try(:category).try(:name) == "Rails 5" 
     = link_to(image_tag("select/rails5.png"), tuto_path(tuto)) 
     -elsif tuto.try(:category).try(:name) == "Heroku" 
     = link_to(image_tag("select/heroku.png"), tuto_path(tuto)) 
     -elsif tuto.try(:category).try(:name) == "AWS-Amazon" 
     = link_to(image_tag("select/aws.png"), tuto_path(tuto))   
Verwandte Themen