ActionController :: UrlGenerationError ...缺少必需的键:[:id]

问题描述:

我已阅读以前有关此错误的问题的答案,但似乎无法使其适应当前情况。ActionController :: UrlGenerationError ...缺少必需的键:[:id]

我通过TUTS + Riding Ruby on Rails课程的国际化部分工作(比较我的代码在course repo什么的),并进行演练,我不得不默认区域设置更改为葡萄牙(PT),并更改路线,以便我的问题和项目资源由语言环境(例如localhost3000/pt/issues/14)作为前缀,在我的路线文件中,范围在/:locale之下。

似乎由于某种原因ID密钥正在被区域设置哈希取代。当我提交新问题时,出现以下错误:

ActionController::UrlGenerationError in Issues#show 
Showing /Users/andrekibbe/code/new_issues/app/views/issues/show.html.erb where line #19 raised: 
No route matches {:action=>"show", :controller=>"projects", :id=>nil, :locale=>#<Project id: 1, name: "First project", description: "A little description", created_at: "2015-06-20 15:34:58", updated_at: "2015-06-20 15:34:58">} missing required keys: [:id] 

我在做什么错?我有正确的路径名吗?

提取的源(围绕线#19):

问题/ show.html.erb

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Title:</strong> 
    <%= @issue.title %> 
</p> 

<p> 
    <strong>Description:</strong> 
    <%= @issue.description %> 
</p> 

<p> 
    <strong>No followers:</strong> 
    <%= @issue.no_followers %> 
</p> 

<p><b>Project: </b> 
<%= link_to @issue.project.name, @issue.project %></p> 

<%= link_to 'Edit', edit_issue_path(@issue) %> | 
<%= link_to 'Back', issues_path %> 

这里有问题的create行动和项目控制器:

issues_controller.rb

def create 
    @issue = Issue.new(issue_params) 

    respond_to do |format| 
    if @issue.save 
     format.html { redirect_to @issue, notice: t('issues.created') } 
     format.json { render :show, status: :created, location: @issue } 
    else 
     format.html { render :new } 
     format.json { render json: @issue.errors, status: :unprocessable_entity } 
    end 
    end 
end 

projects_controller.rb

def create 
    @project = Project.new(project_params) 

    respond_to do |format| 
    if @project.save 
     format.html { redirect_to @project, notice: 'Project was successfully created.' } 
     format.json { render :show, status: :created, location: @project } 
    else 
     format.html { render :new } 
     format.json { render json: @project.errors, status: :unprocessable_entity } 
    end 
    end 
end 

我的问题控制器的显示方法,要求通过@Pavan,是Rails默认。这里看不到太多。

issues_controller.rb

def show 
end 

我的路线:

的routes.rb

Rails.application.routes.draw do 
    scope "/:locale" do 
    get 'timeline/index' 

    resources :projects 
    resources :issues 
    end 
end 

耙路线

timeline_index GET /:locale/timeline/index(.:format) timeline#index 
     projects GET /:locale/projects(.:format)   projects#index 
       POST /:locale/projects(.:format)   projects#create 
    new_project GET /:locale/projects/new(.:format)  projects#new 
    edit_project GET /:locale/projects/:id/edit(.:format) projects#edit 
     project GET /:locale/projects/:id(.:format)  projects#show 
       PATCH /:locale/projects/:id(.:format)  projects#update 
       PUT /:locale/projects/:id(.:format)  projects#update 
       DELETE /:locale/projects/:id(.:format)  projects#destroy 
     issues GET /:locale/issues(.:format)   issues#index 
       POST /:locale/issues(.:format)   issues#create 
    new_issue GET /:locale/issues/new(.:format)  issues#new 
    edit_issue GET /:locale/issues/:id/edit(.:format) issues#edit 
     issue GET /:locale/issues/:id(.:format)  issues#show 
       PATCH /:locale/issues/:id(.:format)  issues#update 
       PUT /:locale/issues/:id(.:format)  issues#update 
       DELETE /:locale/issues/:id(.:format)  issues#destroy 

我改变了路径那些@nathanvda建议,但建议从内部Rails框架代码本身产生以下错误消息:

NoMethodError in IssuesController#index 
undefined method `set_locale' for #<IssuesController:0x007fd2f9fc2460> 
Extracted source (around line #432): 

case filter 
    when Symbol 
     lambda { |target, _, &blk| target.send filter, &blk } 
    when String 
     l = eval "lambda { |value| #{filter} }" 
     lambda { |target, value| target.instance_exec(value, &l) } 
+0

请更新您的帖子,使用'issues_controller'的'show'方法 – Pavan

+0

@Pavan已添加,但正如我在编辑中提到的那样,它只是默认方法,除了它继承的方法外,它是空的。 – Gameboy70

+0

尝试给它像这样''%= link_to @ issue.project.name,@ issue.project.id%>' – Pavan

既然你作用域的语言环境下的一切,轨道路线佣工假设第一个助手是语言环境。

如果你写你的链接如下,你应该是不错的:

link_to @issue.project.name, [I18n.locale, @issue.project] 

但这似乎有点乏味。更妙的是从I18n guides尖端:语言环境添加到默认网址选项,添加以下方法您ApplicationController

def default_url_options(options = {}) 
    { locale: I18n.locale }.merge options 
end 

,然后你的链接应该是工作,因为他们是。

+0

在这两种情况下,我直接从Rails运行到'IssuesController#index'消息中的'NoMethodError。当我有机会时,我会将完整的信息添加到主帖子中,但是感谢您的建议。 – Gameboy70

+0

这个答案是正确的。 'default_url_options'解决了这个问题。 – josemota

+0

所以我回答了这个问题,但是因为你有另外一个问题出现,这还不够好?我必须预见你会遇到的所有可能的问题?这个错误意味着你调用了一个'set_locale'方法(可能在'before_filter'中?这个没有定义)。这应该是另一个问题,你不能延续问题。 – nathanvda