Rails的link_to方法的奇怪行为
Rails的link_to方法的奇怪行为
问题:当我点击link_to操作时,应用程序调用另一个控制器,导致缺少id错误。
我有一个菜单,显示用于创建新对象的按钮,当用户创建对象后,这些按钮会转换为导航链接。
行为使用object.exists?辅助程序。
感谢这篇文章:
https://stackoverflow.com/questions/13186722/what-is-the-difference-between-using-exists-and-present-in-ruby
我可以创建一个新的公司并访问编辑链接,但是当我尝试随后创建一个预审文件时,我得到:
Prequalifications#new中的ActionController::UrlGenerationError No route matches {:action=>"edit", :controller=>"companies", :format=>nil, :id=>nil, :locale=>:en},可能的未匹配约束:[:id]
公司和预审的控制器是分开的。我不明白为什么会出现此错误。特别是当我在执行预审之前删除公司模型的引用链接时,它似乎按预期工作。
我的路由非常简单:
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
另一个模型的控制器看起来非常相似。
这种行为可能来自哪里?
在这个问题中,出现错误的原因是在使用link_to
时,传入了nil
作为参数,而routes.rb
文件中定义了在编辑一个公司时需要传入一个有效的id。这导致了生成URL时出现错误。
解决方法是使用.exists?
和.exists
来测试对象是否存在,而不是测试类是否存在。因为Company.exists
和Prequalification.exists
始终为true,不管对象是否存在。因此,需要将它们改为使用.exists?
来测试实际的公司和预先资格是否存在。
Vincent的建议解决了这个问题。但是,使用x.exists?
仍然无法正常工作。并且,Rails在调用另一个控制器时并不是直接调用,而是通过URL生成器生成URL。因此,在生成URL时,如果传入了nil
而不是有效的id
,就会出现错误。
以上就是关于"Strange behavior of rails with link_to"问题的出现原因以及解决方法的整理。