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) }
既然你作用域的语言环境下的一切,轨道路线佣工假设第一个助手是语言环境。
如果你写你的链接如下,你应该是不错的:
link_to @issue.project.name, [I18n.locale, @issue.project]
但这似乎有点乏味。更妙的是从I18n guides尖端:语言环境添加到默认网址选项,添加以下方法您ApplicationController
:
def default_url_options(options = {})
{ locale: I18n.locale }.merge options
end
,然后你的链接应该是工作,因为他们是。
在这两种情况下,我直接从Rails运行到'IssuesController#index'消息中的'NoMethodError。当我有机会时,我会将完整的信息添加到主帖子中,但是感谢您的建议。 – Gameboy70
这个答案是正确的。 'default_url_options'解决了这个问题。 – josemota
所以我回答了这个问题,但是因为你有另外一个问题出现,这还不够好?我必须预见你会遇到的所有可能的问题?这个错误意味着你调用了一个'set_locale'方法(可能在'before_filter'中?这个没有定义)。这应该是另一个问题,你不能延续问题。 – nathanvda
请更新您的帖子,使用'issues_controller'的'show'方法 – Pavan
@Pavan已添加,但正如我在编辑中提到的那样,它只是默认方法,除了它继承的方法外,它是空的。 – Gameboy70
尝试给它像这样''%= link_to @ issue.project.name,@ issue.project.id%>' – Pavan