【问题标题】:Undefined method :name when showing listing (ruby on rails)未定义的方法:显示列表时的名称(ruby on rails)
【发布时间】:2014-10-02 10:09:02
【问题描述】:

我创建了一个用户个人资料页面,其中显示了用户创建的所有列表。每个列表都有一个“显示”链接,该链接链接到一个新页面,该页面在不同的页面上单独显示列表。我让它为用户个人资料页面工作。 我正在使用这个链接

<li><%= link_to "Show", user_listing_path(name: @user.name, id: listing.id) %></li>

但是,现在我想创建一个列表索引页面,显示每个用户的所有列表。每个列表都应该有一个“显示”链接,该链接链接到单独显示列表的页面。在用户个人资料页面上有效的相同链接在列表索引页面上无效。

我收到以下错误 undefined method `name' for nil:NilClass 它指向

  • 有人知道为什么吗?

    用户展示文件(show.html.erb)

    <div class= "showuser">
                    <div class="error-message">
          <% flash.each do |key, value| %>
            <div class="alert alert-<%= key %>"><%= value %></div>
          <% end %>
          </div>
    
    
    
    <h4>
    <%= gravatar_for @user %>
    <%= @user.name %>
    </h4>
    
    
            <div class="span 8">
                <% if @user.listings.any? %>
                <h3> Job Posts (<%= @user.listings.count %>)</h3>
                <ol class="listings">
                    <%= render @listings %>
                    <% @listings.each do |listing| %>
            <% end %>
                </ol>
                <%= will_paginate @listings %>
                <% end %>
        </div>
    </div>
    

    列表文件(_listing.html.erb)

    <li>
        <h4><%= listing.title %></h4>
        <p><%= listing.location %></h4><br>
        <span class="content"><%= listing.description %></span>
        <span class="timestamp">
            Posted <%= time_ago_in_words(listing.created_at) %> ago
        </span>
        <li><%= link_to "Show", user_listing_path(name: @user.name, id: listing.id) %></li>
        <% if current_user?(listing.user) %>
        <li><%= link_to "Edit", edit_listing_path %></li>
         <%= link_to "delete", listing, method: :delete,
                                        data: { confirm: "You sure?" },
                                        title: listing.description %>
        <% end %>
    </li>
    

    上市控制器

    class ListingsController < ApplicationController
        before_action :signed_in_user, only: [:create, :destroy, :edit, :update]
        before_action :correct_user,   only: [:destroy, :edit, :update]
    
        def create
            @listing = current_user.listings.build(listing_params)
            if @listing.save
                flash[:success] = "Job Post created"
                redirect_to current_user
                else
                    render 'listings/new'
                end
            end
    
    
    
            def edit
            end
    
        def update
            if @listing.update_attributes(listing_params)
            flash[:success] = "Listing updated"
            redirect_to @listing
        else 
          render 'edit'
        end
      end
    
            def show
                @user = User.find_by_name(params[:name])
                @listing = Listing.find_by_id(params[:id])
    
            end
    
            def new
                @listing = Listing.new
                @listings = Listing.paginate(page: params[:page])
            end
    
        def destroy 
            @listing.destroy
            redirect_to current_user
        end
    
        def index
        @listings = Listing.all
        @listings = Listing.paginate(page: params[:page])
        @user = User.find_by_name(params[:name])
        @listing = Listing.find_by_id(params[:id])
      end
    
    
    
        private 
    
    
    
        def listing_params
            params.require(:listing).permit(:description, :location, :title)
        end
    
        def correct_user
            @listing = current_user.listings.find_by(id: params[:id])
            redirect_to current_user if @listing.nil?
        end
    
    end
    

    列表显示文件 (show.html.erb) 单独显示列表

    <div class="show_listing">
    
        <div class="col-md-6">
        <div class="col-md-6">
            <h3><%= @listing.title %></h3>
            <h3><%= @listing.location %></h3>
            <p><%= @listing.description %></p><br>
            <div class="center">
            <%= link_to "Apply Now", '#', class: "btn btn-info", data: {no_turbolink: true} %>
        </div>
        </div>
    </div>
    </div>
    
    <div class="show_link_position">
    <% if current_user == @listing.user %>
    <%= link_to 'Edit', edit_listing_path, class: "btn btn-link" %> |
    <% end %>
    <%= link_to 'Back', current_user, class: "btn btn-link" %>
    </div>
    

    列出索引文件(index.html.erb)

    <div class="top">
      <div class="categories-container">
         <div class="boxed grid-3 category-link ">
        <li><%= link_to "Find Jobs",  findjobs_path, class: "category-link"%></li>
                  <li><%= link_to "Post Jobs",  new_path, class: "category-link" %></li>
                  <li><%= link_to "Find Jobs",  findjobs_path, class: "category-link" %></li>
                  <li><%= link_to "Post Jobs",  new_path, class: "category-link" %></li>
                  <li><%= link_to "Find Jobs",  findjobs_path, class: "category-link" %></li>
                  <li><%= link_to "Post Jobs",  new_path, class: "category-link" %></li>
                  <li><%= link_to "Find Jobs",  findjobs_path, class: "category-link" %></li>
                  <li><%= link_to "Post Jobs",  new_path, class: "category-link" %></li>
            </div>
        </div>
    
    
    
    <div class="table-container">
    <div class= "grid-8 grid-moved">
      <% @listings.each do |listing| %>
    
      <h4><%= listing.title %></h4>
      <h5> <%= listing.user.name %>, Posted <%= time_ago_in_words(listing.created_at) %> ago</h5>
        <h5>Job Description:</h5>
          <p><%= listing.description %></p>
        <p>Location: <%= listing.location %></p>
        <li><%= link_to "Show", user_listing_path(name: @user.name, id: listing.id) %></li>
        <br><hr><br>
    
      <% end %>
    </div>
    </div>
    
    
    <div class="container">
      <div class="pagination">
        <%= will_paginate @listings %>
      </div>
    </div>
    

    路线

    Rails.application.routes.draw 做 资源:用户 资源:会话,仅:[:new,:create,:destroy] 资源:列表

    root 'static_pages#home'

      match '/signup',  to: 'users#new',            via: 'get'
      match '/signin',   to: 'sessions#new',          via: 'get'
      match '/signout', to: 'sessions#destroy',     via:'delete'
      match '/help',      to: 'static_pages#help',    via: 'get'
      match '/contact',   to: 'static_pages#contact',  via: 'get'
      match '/about',     to: 'static_pages#about',   via: 'get' 
      match '/new',     to: 'listings#new',   via: 'get' 
      match '/users/:name/:id', to: 'listings#show', via: :get, as: :user_listing
      match '/findjobs',     to: 'listings#index',   via: 'get' 
    

    如果我遗漏了任何重要信息,请告诉我。

  • 【问题讨论】:

      标签: html ruby-on-rails ruby ruby-on-rails-3


      【解决方案1】:

      您还没有在控制器中定义@user

      在下一行中,您可以适当地访问列表用户,如下所示: &lt;% if current_user?(listing.user) %&gt;

      您只需将代码调整为如下所示:

      &lt;li&gt;&lt;%= link_to "Show", user_listing_path(name: listing.user.name, id: listing.id) %&gt;&lt;/li&gt;

      有意义吗?

      【讨论】:

      • 这行得通。你能解释一下为什么这个链接在索引页面上有效,而另一个在用户个人资料页面上有效吗?我是 Rails 新手,真的很想学习和理解我在写什么。
      • 您只在控制器的showindex 操作中设置@user 变量。这些变量分配不会持续超出分配它们的请求。如果您在一个已定义 @user 的操作中渲染相同的部分,而在您未定义的一个操作中渲染相同的部分,它将适用于其中一个而不适用于另一个。
      【解决方案2】:

      试试:

      <li><%= link_to "Show", user_listing_path(@user, listing) %></li>
      

      在你的控制器上:

      def show 
        @user = User.find(params[:id)
        @listing = Listing.find(params[:id])
      end
      

      【讨论】:

      • 没有路由匹配 {:action=>"show", :controller=>"listings", :id=>"308", :name=>nil} 缺少必需的键:[:name]
      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2016-12-15
      • 2019-10-31
      • 2018-07-06
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多