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.
4 Réponses :
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) %>
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>
Pour l'identifiant manquant, vous devez faire:
<%= link_to job.title, listing_path(id: @job) %>
puisque votre identifiant est stocké dans la variable @job
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) %>
Où travail
est le travail individuel que le link_to recherche.
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]