2014-08-08 3 views
0

Я создал страницу профиля пользователя, которая отображает все сделанные вами объявления. В каждом листинге есть ссылка «показать», которая ссылается на новую страницу, которая отображает листинг отдельно на другой странице. Я получил это для работы на странице профиля пользователя. Я использую эту ссылкуНеопределенный метод: имя при показе списка (ruby on rails)

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

Однако, теперь я хочу, чтобы создать страницу прейскурантов индекса, который показывает все списки каждого пользователя. В каждом повторном списке должна быть ссылка «показать», которая ссылается на страницу, которая отображает список отдельно. Та же самая ссылка, которая работала на странице профиля пользователя, не работает на странице индекса листинга.

я получаю следующую ошибку неопределенного метода `имя» для ноля: NilClass и это указует на

  • <% = link_to "Показать", user_listing_path (имя: @ user.name, ID: listing.id)%>
  • Кто-нибудь знает почему?

    показать пользователя файл (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 делать ресурсы: пользователи ресурсы: сессии, только: [: новый,: создавать,: уничтожить] ресурсы: списки

    корень 'static_pages # дом'

    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' 
    

    Дайте мне знать, если я откажусь от какой-либо важной информации.

    ответ

    1

    Вы не определили @user в контроллере.

    В следующей строке, вы надлежащим образом получить доступ к пользователю предложение следующим образом: <% if current_user?(listing.user) %>

    Вам просто нужно настроить свой код, чтобы выглядеть следующим образом:

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

    имеет смысл?

    +0

    Это работает. Не могли бы вы объяснить мне, почему эта ссылка работает на странице индекса, а другая на странице профиля пользователя? Я новичок в рельсах и действительно хочу узнать и понять, что я пишу. – user3208597

    +1

    Вы устанавливаете только переменную '@ user' в действиях' show' и 'index' в вашем контроллере. Эти назначения переменных не сохраняются за пределами запроса, в котором они были назначены. Если вы произнесите одно и то же частичное в одном действии, где вы определили '@ user', а другой, где у вас нет, он будет работать для одного, а не для другого. –

    0

    Try:

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

    А на контроллере:

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

    Нет совпадений маршрутов {: action => "show",: controller => "listings",: id => "308",: name => nil} отсутствуют необходимые ключи: [: name] – user3208597

    Смежные вопросы