铁杆新手。在关于多态关联的教程之后,我讨论了在 create 和 destroy 中设置@client。
git reset --hard origin/develop
我通常只习惯你只能找到@client = Client.find(params [:id])
所以如何处理有两个参数?如何||工作吗
FavoriteClientsController.rb:
@client = Client.find(params[:client_id] || params[:id])
控制器的完整代码,可以看到模型here
使用rails 5
答案 0 :(得分:4)
表达式:params[:client_id] || params[:id]
与:
if params[:client_id]
params[:client_id]
else
params[:id]
end
答案 1 :(得分:1)
教你做的教程
Client.find(params[:client_id] || params[:id])
是一个超级糟糕的教程:)我强烈建议你切换到另一个。
回到主题:it is logical OR:如果第一个表达式既不是nil
也不是false
,则返回它,否则返回第二个表达式。
答案 2 :(得分:1)
如果请求参数中有一个,那就是<system.web>
<customErrors mode="Off" />
</system.web>
<system.webServer>
<httpErrors errorMode="Detailed" existingResponse="PassThrough" />
</system.webServer>
试图找到客户端。如果不是,它试图通过client_id
找到客户。
然而,这样的实践可能会让你痛苦而不是利润。
答案 3 :(得分:1)
哇,这是一个非常糟糕的方法。
为多态儿童做控制器的一个非常可扩展和干净的模式是使用继承:
class FavoritesController < ApplicationController
def create
@favorite = @parent.favorites.new(user: current_user)
if @favorite.save
redirect_to @parent, notice: 'Leverandøren er tilføjet til favoritter'
else
redirect_to @parent, alert: 'Noget gik galt...*sad panda*'
end
end
def destroy
@favorite = @parent.favorites.find_by(user: current_user)
redirect_to @parent, notice: 'Leverandøren er nu fjernet fra favoritter'
end
private
def set_parent
parent_class.includes(:favorites).find(param_key)
end
def parent_class
# this will look up Parent if the controller is Parents::FavoritesController
self.class.name.deconstantize.singularize.constantify
end
def param_key
"#{ parent_class.naming.param_key }_id"
end
end
然后我们定义子类:
# app/controllers/clients/favorites_controller.rb
module Clients
class FavoritesController < ::FavoritesController; end
end
# just an example
# app/controllers/posts/favorites_controller.rb
module Posts
class FavoritesController < ::FavoritesController; end
end
然后,您可以使用以下方法创建路线:
Rails.application.routes.draw do
# this is just a routing helper that proxies resources
def favoritable_resources(*names, **kwargs)
[*names].flatten.each do |name|
resources(name, kwargs) do
scope(module: name) do
resource :favorite, only: [:create, :destroy]
end
yield if block_given?
end
end
end
favoritable_resources :clients, :posts
end
最终结果是基于OOP而不是“聪明”代码的可自定义模式。