Окружающая среда:
- Рельсы 3.2.3
- Mac OS X Лев
- Рубин-1.9.3-p194 (МРТ)
У меня есть приложение rails, и я использую app/views/layouts/application.html.erb в качестве своего рода «левой навигационной панели» для некоторых ссылок, которые я использую в качестве параметров меню.
В меню есть две ссылки, использующие link_to (здесь сокращено для краткости). Если я УДАЛЮ одну ссылку и запущу приложение, оставшаяся ссылка сделает то, что должна. Если я УДАЛЮ вторую ссылку и ВОССТАНОВЛЮ первую ссылку, первая ссылка сделает то, что ОНА должна делать.
Однако, если у меня есть обе ссылки в меню одновременно, щелчок по одной из них будет работать, но щелчок по второй создает ошибку времени выполнения.
Используя Pry и сам исходный код Rails (3.2.3), я точно указал, где возникает ошибка во фреймворке. Исключение возникает в actionpack-3.2.3/lib/action_view/template.rb и происходит в методе рендеринга в следующей строке кода:
def render(view, locals, buffer=nil, &block)
ActiveSupport::Notifications.instrument("!render_template.action_view", :virtual_path => @virtual_path) do
compile!(view)
view.send(method_name, locals, buffer, &block) # <----ERROR OCCURS HERE
end
rescue Exception => e
handle_render_error(view, e)
end
Значение method_name = _app_views_layouts_application_html_erb___1387085669206687706_70334317584180
В представлении есть метод с таким именем. Когда выполняется «отправка», генерируется следующее исключение.
ActionController::RoutingError: No route matches {:action=>"signup_for_role",
:controller=>"assignments", :club_id=>nil, :member_id=>[#<Member id: 2, first_name:
"Joseph", last_name: "Smith", start_date: "2012-01-01", end_date: "9999-12-31",
created_at: "2012-04-07 13:58:46", updated_at: "2012-05-06 21:54:12", club_id: 2, email:
"[email protected]", assignable: true, address_one: nil, address_two: nil, city: nil,
state: nil, zip_code: nil, phone: nil, mobile_phone: nil>]}
Поскольку код в методе генерируется Rails, а не в файле исходного кода, я не могу выполнить его с помощью Pry; Я могу только «отправить» сообщение и увидеть результат.
Вот код макета с двумя рассматриваемыми ссылками:
<!DOCTYPE html>
<html>
<head>
<title>MyApp</title>
<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
</head>
<body>
<div style='padding-left:10px; margin-top:10px; ' >
<div class='container' style='margin-top:50px; margin-left:50px;padding-right:200px; '>
<!-- This link_to works, whether alone, or when the other link_to is present -->
<%= link_to "Sign Up for a Role", signup_for_role_club_member_assignments_path(params[:club_id], current_user_as_member) %>
<br/><br/>
<!-- This link_to fails when both link_to's are present, but works when the other link_to is removed. -->
<%= link_to "Clubs", clubs_path %><br>
</div>
<!-- ***************************************************************** -->
<!-- Yield below... this is where the currently selected view displays -->
<!-- ***************************************************************** -->
<div class='container' style='margin-left:200px' >
<%= yield %>
</div>
</div>
</body>
</html>
Наконец, вот мой файл route.rb:
Rolemaster::Application.routes.draw do
resources :sessions
resources :enrollments
resources :logs
resources :clubs do
resources :members do
resources :assignments do
collection do
get 'signup_for_role'
get 'display_success'
get 'past_activity'
end
end
resources :absences
end
resources :roles
resources :role_groups
resources :meetings do
get 'forassignment', :on => :collection
get 'print'
resources :assignments
end
resources :assignments do
post 'generate', :on => :collection
end
resources :absences do
get 'list', :on => :collection
end
end
resources :users do
put "update_password" => "users#update_password"
put "update_email" => "users#update_email"
get "edit_password" => "users#edit_password"
get "edit_email" => "users#edit_email"
end
match "agendas/print"
get "enrollments/new"
post "enrollments/create"
get "log_in" => "sessions#new", :as => "log_in"
get "log_out" => "sessions#destroy", :as => "log_out"
get "sign_up" => 'users#new', :as => 'sign_up'
get "test/email"
get "sessions/revoke_admin"
get "sessions/revoke_super_user"
get "admins" => "admins#index"
root :to => 'sessions#new'
end
Любая помощь приветствуется. Я, наверное, потратил на это часов 20 или больше.