2015-06-21 2 views
1

Я прочитал предыдущие ответы на вопросы об этой ошибке, но я не могу их адаптировать к моей текущей ситуации.ActionController :: UrlGenerationError ... missing required keys: [: id]

Я работаю через раздел I18N на Tuts + Riding Ruby on Rails курса (сравнивая свой код на то, что в course repo), так и для физических упражнений я должен был изменить локаль по умолчанию Португалия (PT), и изменить чтобы мои ресурсы Issue и Projects были добавлены в локаль (например, localhost3000/pt/issues/14), область под номером /:locale в файле маршрутов.

Похоже, что идентификатор ключа по какой-то причине заменен хэшем локали. Когда я отправляю новый выпуск, я получаю следующую ошибку:

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

Обновите свое сообщение с помощью 'show' метода вашего' issues_controller' – Pavan

+0

@Pavan Добавлено, но, как я упоминал в редактировании, это только метод по умолчанию, пустой, за исключением того, что он наследует. – Gameboy70

+0

Попробуйте дать это так: '<% = link_to @ issue.project.name, @ issue.project.id%>' – Pavan

ответ

2

Поскольку вы все под областью действия локали, рельсы маршрутные хелперы предполагая первый помощник - это локаль.

Если вы пишете ссылку следующим образом, вы должны быть хорошо:

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

Но это, кажется, немного утомительно.Еще лучше наконечник из I18n guides: добавить локаль параметры URL-адрес по умолчанию, добавьте следующий метод к вашему ApplicationController:

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

, а затем ваши ссылки должны работать, как они были.

+0

В обоих случаях я запускаю сообщение «NoMethodError in IssuesController # index» прямо из Rails. Я добавлю полное сообщение на главный пост, когда получаю шанс, но спасибо за предложение. – Gameboy70

+0

Этот ответ верный. 'default_url_options' решает проблему. – josemota

+0

Итак, я ответил на вопрос, но поскольку у вас возникла другая проблема, это не достаточно хорошо? Я должен предвидеть все возможные проблемы, с которыми вы столкнулись? Ошибка означает, что вы вызываете метод 'set_locale' (возможно, в' before_filter', который не определен). Это должен быть другой вопрос, вы не можете продолжать распространять вопросы. – nathanvda