Отсутствуют необходимые ключи: [: id] - Маршрутизация к представлению для каждого экземпляра моей модели с уникальным идентификатором. - PullRequest
0 голосов
/ 11 февраля 2019

Я работаю на доске объявлений, чтобы изучать / практиковать рельсы.У меня есть отдельное представление для каждой категории вакансий, и я хочу, чтобы пользователь мог щелкнуть по публикации определенного задания, чтобы получить доступ к другому представлению со всеми деталями списка.Я частично разобрался с маршрутизацией, так как я могу перейти к localhost: 3000 / jobs / list / 7, например, чтобы посмотреть представление для id: 7.У меня возникла проблема со ссылкой на / перечисление /: id из представления категории моей работы, и я могу получить доступ к представлению только для определенного идентификатора, введя его в адресную строку.Я работал над этим в течение нескольких дней и проверил много связанных вопросов здесь, но, похоже, не могу понять это.Я полагаю, что упускаю из виду простую, но критическую деталь, так как я не очень разбираюсь в рельсах.

Вот мой взгляд на категорию работы:

<div class="cat-banner" id="developer">
    <h1>Human Resources Jobs</h1>
    <h4 class="listing-count"><%= Job.where(:category => 'Human Resources').count.to_s + ' Listings' %></h4>
</div>

<div class="category-page">
    <!-- Full-Stack Developer Jobs -->
    <div class="jobs-posted">
        <hr class="other-line">
        <% if Job.where(:category => 'Human Resources').count > 0 %>
            <% @jobs.each do |job| %>
                <div class="job">
                    <% if job.category == "Human Resources" %>
                        <span class="job-logo"><%= image_tag('salesforce.png', :size => "60x40") %></span>
                        <span id="line-align"><p class="title"><%= link_to job.title, listing_path(@job) %> </p>                
<p class="name"><%= job.name %></p></span>

                        <% if job.location == "Remote" %>
                            <span class="remote-tag"><%= job.location.upcase %></span>
                        <% else %>
                            <p class="location"><%= job.location %></p>
                        <% end %>

                        <p class="kind"><%= job.kind %></p>
                        <p class="time-stamp"><%= job.created_at.strftime("%A, %B %d %Y") %></p>
                        <hr class="line">
                    <% end %>
                </div>
            <% end %>
        <% else %>
            <p>There are no human resources jobs at the moment...</p>
            <p style="text-decoration: underline;"><%= link_to 'Post a Human Resources Job Here', new_job_path %></p>
        <% end %>
    </div>
    <!-- End of Human Resources Jobs -->
</div>

И мой route.rbfile:

    Rails.application.routes.draw do

  get 'subscribers' => 'subscribers#index'

  get 'jobs/remote' => 'jobs#remote'

  get 'jobs/listing/:id' => 'jobs#listing', as: 'listing'

  get 'jobs/company' => 'jobs#company'

  get 'jobs/dev' => 'jobs#dev'

  get 'jobs/design' => 'jobs#design'

  get 'jobs/marketing' => 'jobs#marketing'

  get 'jobs/ai' => 'jobs#ai'

  get 'jobs/fullstack' => 'jobs#fullstack'

  get 'jobs/frontend' => 'jobs#frontend'

  get 'jobs/backend' => 'jobs#backend'

  get 'jobs/it' => 'jobs#it'

  get 'jobs/software' => 'jobs#software' 

  get 'jobs/product' => 'jobs#product'

  get 'jobs/cloud' => 'jobs#cloud'

  get 'jobs/mobile' => 'jobs#mobile'

  get 'jobs/database' => 'jobs#database'

  get 'jobs/datascience' => 'jobs#datascience'

  get 'jobs/blockchain' => 'jobs#blockchain' 

  get 'jobs/security' => 'jobs#security'

  get 'jobs/support' => 'jobs#support'

  get 'jobs/network' => 'jobs#network'

  get 'jobs/finance' => 'jobs#finance'

  get 'jobs/sales' => 'jobs#sales'

  get 'jobs/hr' => 'jobs#hr' 

  get 'jobs/businessdev' => 'jobs#businessdev'

  resources :jobs


  root 'jobs#index'

  get 'jobs/index'

  get 'jobs/new'

И часть контроллера заданий:

    class JobsController < ApplicationController
  def index
    @jobs = Job.all
    @subscribers = Subscriber.all
  end
  def new
    @job = Job.new
  end

  def listing
    @job = Job.find(params[:id])
  end
  def show
    @job = Job.find(params[:id])
  end
  def create
    @job = Job.new(params.require(:job).permit(:title, :url, :category, :kind, :location, :description, :name, :summary, :website, :email, :companyDescription, :headquarters ))


    if @job.save
      redirect_to root_path
    else
      render "new"
    end

    respond_to :html, :json
  end

Я пробовал:

<%= link_to job.title, listing_path(@job) %> 
<%= link_to job.title, listing_path(@job.id) %> 
<%= link_to job.title, listing_path(@job[:id]) %> 
<%= link_to job.title, listing_path %>

и другие варианты, которые, как я думал, будут работатьчтение StackOverflow

Я полагаю, что моя проблема связана с этим оператором link_to (неправильный синтаксис?), так как все выглядит нормально в моем контроллере заданий и файле маршрутов.

Я либо получаю: Нет совпадений маршрутов {:action => "list",: controller => "jobs",: id => nil}, отсутствуют обязательные ключи: [: id],

или

неопределенный метод `id 'дляnil: NilClass,

или

неопределенный метод `[] 'для nil: NilClass

Ошибка« отсутствуют обязательные ключи: [: id] »меня смущает.Я проверил много ресурсов, пытаясь выяснить, как передать: id, но не могу решить.

Это мой первый пост здесь, и я ДЕЙСТВИТЕЛЬНО благодарен за любую помощь и с нетерпением жду, чтобы стать достаточно знающимв будущем, поэтому я тоже могу отвечать на вопросы.

рейк-маршруты

Ответы [ 4 ]

0 голосов
/ 11 февраля 2019

Кажется, причина этого не в том, что вы не отправляете правильный аргумент на link_to здесь:

<%= link_to job.title, listing_path(@job) %>

Вы должны помнить, что вы перебираете все свои @jobs и вызывая каждую отдельную работу с переменной job между ||.Вы пытаетесь создать ссылку на каждое отдельное задание, поэтому правильное значение link_to должно быть следующим:

<%= link_to job.title, listing_path(job) %>

Где job - это отдельное задание, которое ищет link_to.

0 голосов
/ 11 февраля 2019

Как ясно указывает на ошибка, ваш путь ожидает идентификатор задания, но не получает его, поэтому, проверяя ваш вызов пути, в строке:

<span id="line-align"><p class="title"><%= link_to job.title, listing_path(@job) %> </p>                

вы передаете @job какукажите путь к списку.

измените его на job, чтобы оно было:

<span id="line-align"><p class="title"><%= link_to job.title, listing_path(job) %> </p>
0 голосов
/ 11 февраля 2019

Для пропущенного идентификатора вы должны сделать:

<%= link_to job.title, listing_path(id: @job) %>

, поскольку ваш идентификатор хранится в переменной @job

0 голосов
/ 11 февраля 2019

Представление, которое вы помещаете в качестве примера, использует переменную экземпляра @ jobs .В соответствии с вашим контроллером это будет ваше действие индексации, в котором вы не определите @ job

Примечание: Обратите внимание на то, что вы используете @jobs и job на вашем итераторе

Так что я думаю, что если вы измените @job на job, это решит проблему в этом представлении

<%= link_to job.title, listing_path(job) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...