Странное поведение рельсов с link_to - PullRequest
0 голосов
/ 07 января 2019

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

У меня есть меню, в котором отображаются кнопки для создания новых объектов, которые преобразуются в навигационные ссылки при создании объекта пользователем.

поведение использует object.exists? помощник.

<div class="nav-wrapper">
  <!-- start menu  -->
  <ul class="nav flex-column">
    <li class="list-group-item"><%= link_to "Personal information", edit_user_registration_path %></li>
    <li class="list-group-item"><%= link_to "Settings", notification_settings_path %></li>
    <li class="list-group-item"><%= link_to "Payments", payment_method_path %></li>
   <% if Prequalification.exists? %>
    <li class="list-group-item"><%= link_to "Edit prequalification",edit_prequalification_path(@user, @prequalification) %></li>
   <% end %>
   <% if Company.exists? %>
    <li class="list-group-item"><%= link_to "Edit company data",edit_company_path(@user, @company) %></li>
   <% end %>
 </ul>
 <ul class="nav flex-column mt-5">
   <% if !Company.exists? %>
    <a class="btn btn-primary btn-block mt-1"  href="companies/new">Add a company</a>
   <% end %>
   <% if !Prequalification.exists? %>
    <a class="btn btn-primary btn-block mt-1"  href="prequalifications/new">Prequalify for loan or rents</a>
    <% end %>
  </ul>
</div>

Благодаря этому сообщению:

https://stackoverflow.com/questions/13186722/what-is-the-difference-between-using-exists-and-present-in-ruby

Я могу создать новую компанию и получить доступ к ссылке на редактирование, но когда я пытаюсь впоследствии создать файл предварительной квалификации, я получаю:

ActionController::UrlGenerationError in Prequalifications#new

No route matches {:action=>"edit", :controller=>"companies", :format=>nil, :id=>nil, :locale=>:en}, possible unmatched constraints: [:id]

Контроллеры для компаний и предварительных квалификаций разделены. Я не понимаю, почему происходит ошибка. Тем более, что если я удаляю ссылку link_to на модель компании, прежде чем приступить к предварительному квалификационному экзамену, то, похоже, она работает как задумано.

мои маршруты очень просты:

resources :prequalifications
resources :companies

мой контроллер тоже довольно прост:

def new
 @company = Company.new
end

def create
 @company = current_user.build_company(company_params
end

def edit
 @user = current_user
 @company = Company.find_by(id: [params[:id], params[:company_id]])
end

Контроллер для другой модели выглядит очень похоже.

Откуда могло произойти это поведение?

1 Ответ

0 голосов
/ 07 января 2019

Вы хотите проверить @company.exists? и @prequalification.exists вместо Company.exists и Prequalification.exists, в противном случае вы проверяете, существует ли класс (что всегда имеет место), а не существует ли фактическая компания и преквалификация.

Вот почему вы получаете ошибку при редактировании ссылки на компанию, поскольку Company.exists имеет значение true, даже если @company = nil пытается создать ссылку для нулевого объекта

...