link_to не работает с другими link_to на той же странице, но работает отдельно

Окружающая среда:

  • Рельсы 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 или больше.


person MotownJoe    schedule 23.05.2012    source источник
comment
но у вас ошибка с первой ссылкой...club_id nil, а member_id - это массив   -  person Yuri Barbashov    schedule 23.05.2012
comment
Юрий... первая ссылка работает как и задумано. current_user_as_member — это метод в моем ApplicationController, который возвращает правильное значение для вошедшего в систему пользователя. Итак, эта ссылка работает найти. Это (должен быть) супер-простой Клуб, который не работает.   -  person MotownJoe    schedule 23.05.2012
comment
Кроме того, я должен упомянуть, что МАРШРУТИЗАЦИЯ для этих двух ссылок действительно работает. Они получают правильное действие в правильном контроллере. Это рендеринг представления, где возникает проблема.   -  person MotownJoe    schedule 23.05.2012
comment
замените params[:club_id] на 2 и покажите мне ошибку   -  person Yuri Barbashov    schedule 23.05.2012
comment
Юрий, я смогу попробовать это только сегодня, но, кажется, я понимаю, о чем ты говоришь. Позвольте мне посмотреть, могу ли я правильно сформулировать это: если в макете есть ЛЮБЫЕ ссылки, щелчок по ЛЮБОЙ из них отобразит цель В макете. Таким образом, ВСЕ ссылки в макете могут ссылаться на параметры, которые будут присутствовать при нажатии ЛЮБОЙ ссылки в макете и передаче управления на эту целевую страницу. Или... если вы указали другой макет для этой цели, который не имеет этих других ссылок. Это звучит правильно? Я подтвержу с тестом, как вы просили.   -  person MotownJoe    schedule 23.05.2012
comment
Юрий, вы правы, сэр! Я очень новичок в stackoverflow, поэтому, пожалуйста, не стесняйтесь обращаться ко мне, если я не обновлю или не закрою этот вопрос, чтобы вы получили всю репутацию или баллы, которые вы заслуживаете за ответ на мой вопрос.   -  person MotownJoe    schedule 24.05.2012
comment
На самом деле, вам нужно опубликовать свой комментарий как «ответ», чтобы я мог принять этот ответ как правильный?   -  person MotownJoe    schedule 24.05.2012
comment
у вас недостаточно представителей, поэтому вы не можете проголосовать, но вы можете принять ответ. нп.   -  person Yuri Barbashov    schedule 24.05.2012


Ответы (1)


Всегда читайте сообщения об ошибках, правда где-то рядом)

params[:club_id] is nil
person Yuri Barbashov    schedule 23.05.2012