问题:当我执行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
其他型号的控制器看起来非常相似。
该行为可能从何而来?
答案 0 :(得分:0)
您要测试@company.exists?
和@prequalification.exists
而不是Company.exists
和Prequalification.exists
,否则,您要测试类是否存在(通常是这种情况),而不是是否实际的公司和资格预审存在。
这就是为什么您在编辑公司链接上出现错误的原因,因为Company.exists
正确,即使@company = nil
也会尝试为nil对象建立链接