带有link_to的Rails的奇怪行为

时间:2019-01-07 15:30:43

标签: routes ruby-on-rails-5

问题:当我执行link_to动作时,应用程序调用了另一个控制器,导致缺少ID错误。

我有一个菜单,其中显示用于创建新对象的按钮,这些按钮在用户创建对象时会转换为导航链接。

该行为正在使用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_一样,它似乎可以按预期工作。

我的路线很简单:

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 :(得分:0)

您要测试@company.exists?@prequalification.exists而不是Company.existsPrequalification.exists,否则,您要测试类是否存在(通常是这种情况),而不是是否实际的公司和资格预审存在。

这就是为什么您在编辑公司链接上出现错误的原因,因为Company.exists正确,即使@company = nil也会尝试为nil对象建立链接