Ruby on rails 缺少必需的键:[:id]-路由到具有唯一id的模型的每个实例的视图

Ruby on rails 缺少必需的键:[:id]-路由到具有唯一id的模型的每个实例的视图,ruby-on-rails,ruby,model-view-controller,routing,Ruby On Rails,Ruby,Model View Controller,Routing,我正在一个工作板上学习/练习rails。我对每个工作类别都有一个单独的视图,我希望用户能够单击某个特定的工作公告来访问另一个包含列表所有详细信息的视图。我已经部分了解了路由,例如,我可以转到localhost:3000/jobs/listing/7查看id:7列表的视图。我在从“职务类别”视图链接到/listing/:id时遇到问题,只能通过在地址栏中键入特定id来访问该视图。我已经在这方面工作了好几天,并在这里查看了许多相关问题,但似乎无法理解。我相信我忽略了一个简单但关键的细节,因为我对ra

我正在一个工作板上学习/练习rails。我对每个工作类别都有一个单独的视图,我希望用户能够单击某个特定的工作公告来访问另一个包含列表所有详细信息的视图。我已经部分了解了路由,例如,我可以转到localhost:3000/jobs/listing/7查看id:7列表的视图。我在从“职务类别”视图链接到/listing/:id时遇到问题,只能通过在地址栏中键入特定id来访问该视图。我已经在这方面工作了好几天,并在这里查看了许多相关问题,但似乎无法理解。我相信我忽略了一个简单但关键的细节,因为我对rails不是很有经验

以下是我的职务类别视图:

<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>
以及作业控制器的一部分:

    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 %>
还有其他一些我认为可以通过阅读

我相信我的问题来自于这个链接到错误语法的语句,因为在我的作业控制器和路由文件中一切看起来都很好

我要么得到: 没有与{:action=>listing,:controller=>jobs,:id=>nil}匹配的路由,缺少必需的键:[:id]

nil:NilClass的未定义方法“id”

nil:NilClass的未定义方法“[]”

缺少必需的键:[:id]错误使我感到困惑。我查阅了许多资料,试图找出如何传递:id,但无法解决它

这是我在这里的第一篇文章,我真的很感谢任何帮助,并期待着在未来有足够的知识,这样我也可以回答问题


您作为示例放置的视图使用实例变量@jobs。根据您的控制器,在没有定义@job的情况下,这将是您的索引操作

注意:请注意,在该视图中,您正在迭代器上使用@jobs和job

所以我认为如果你改变@job-for-job,就可以解决这个问题

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

正如错误明确指出的,您的路径需要一个作业id,但它没有得到作业id,因此请检查您对路径的调用,第行:

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

对于缺少的id,您应该执行以下操作:

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

由于您的id存储在变量@job

中,因此此操作不起作用的原因似乎是因为您没有将正确的参数发送到链接\u到此处:


其中job是链接要查找的单个job。

您能在生成的HTML中查找它从列表中产生的值吗_path@job?未生成HTML,我收到错误:Jobshr中的ActionController::UrlGenerationError-没有路由匹配{:action=>listing,:controller=>jobs,:id=>nil},缺少必需的密钥:[:id]
<span id="line-align"><p class="title"><%= link_to job.title, listing_path(job) %> </p>
<%= link_to job.title, listing_path(id: @job) %>
<%= link_to job.title, listing_path(@job) %>
<%= link_to job.title, listing_path(job) %>