2
votes

Clés requises manquantes: [: id] - Routage vers une vue pour chaque instance de mon modèle avec son ID unique

Je travaille sur un job board pour apprendre / pratiquer les rails. J'ai une vue distincte pour chaque catégorie d'emploi, et je veux que l'utilisateur puisse cliquer sur une offre d'emploi particulière pour accéder à une autre vue avec tous les détails de la liste. J'ai partiellement compris le routage, car je suis capable d'aller à localhost: 3000 / jobs / listing / 7 par exemple pour voir la vue de la liste de id: 7. Je rencontre un problème pour me connecter à / listing /: id à partir de la vue de ma catégorie d'emploi et je ne peux accéder à une vue que pour un identifiant spécifique en le saisissant dans la barre d'adresse. J'y travaille depuis des jours et j'ai vérifié de nombreuses questions connexes ici, mais je n'arrive pas à le comprendre. Je crois que je néglige un détail simple, mais critique, car je ne suis pas très expérimenté avec les rails.

Voici ma vue de catégorie d'emploi:

<%= 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 %>

fichier routes.rb:

    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

Et une partie du contrôleur de travaux:

    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'

J'ai essayé: p >

<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>

et d'autres variantes qui, selon moi, fonctionneraient à la lecture de StackOverflow

Je crois que mon problème vient de cette instruction link_to (syntaxe incorrecte?), car tout va bien dans mon contrôleur de tâches et mon fichier de routes.

Soit j'obtiens: Aucune route ne correspond à {: action => "listing",: controller => "jobs",: id => nil}, clés requises manquantes: [: id],

ou

méthode non définie `id 'pour nil: NilClass,

ou

méthode non définie` []' pour nil: NilClass

Les "clés requises manquantes: [ : id] "erreur me déroute. J'ai consulté de nombreuses ressources en essayant de comprendre comment passer le: id mais je ne peux pas le résoudre.

C'est mon premier message ici et j'apprécie VRAIMENT toute aide et j'ai hâte d'être bien informé assez à l'avenir pour que je puisse aussi répondre aux questions.

rake routes a>


2 commentaires

Pouvez-vous regarder dans votre HTML généré quelle est la valeur qu'il produit à partir de listing_path (@job) ?


Le HTML n'est pas généré, j'obtiens l'erreur: ActionController :: UrlGenerationError in Jobs # hr - Aucune route ne correspond à {: action => "listing",: controller => "jobs",: id => nil} , clés requises manquantes: [: id]


4 Réponses :


2
votes

La vue que vous donnez à titre d'exemple utilise la variable d'instance @jobs . Selon votre contrôleur, ce serait votre action d'indexation où vous n'avez pas défini @job

Remarque: Remarquez que sur cette vue, vous utilisez @jobs et job sur votre itérateur

Donc je pense que si vous changez @job pour job, cela résoudrait le problème sur cette vue

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


0 commentaires

2
votes

Comme l'erreur l'indique clairement, votre chemin attend un identifiant de tâche mais il n'en reçoit pas, donc inspectez votre appel pour le chemin, en ligne:

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

vous passez @job comme paramètre du chemin de la liste.

changez-le en job pour qu'il soit:

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


0 commentaires

0
votes

Pour l'identifiant manquant, vous devez faire:

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

puisque votre identifiant est stocké dans la variable @job


0 commentaires

0
votes

Il semble que la raison pour laquelle cela ne fonctionne pas est que vous n’envoyez pas le bon argument à votre link_to ici:

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

Vous devez vous rappeler que vous parcourez toutes vos @jobs et appelez chaque travail individuel avec la variable travail entre les | |. Vous essayez de créer un lien vers chaque travail individuel, donc le lien correct doit être:

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

travail est le travail individuel que le link_to recherche.


0 commentaires