怎么做||在?:@client = client.find(params [:client_id] || params [:id])

时间:2017-01-27 11:37:14

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5

铁杆新手。在关于多态关联的教程之后,我讨论了在 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

4 个答案:

答案 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而不是“聪明”代码的可自定义模式。