Rails 5 - 用另一个参数

时间:2016-11-21 04:33:23

标签: ruby-on-rails

我正在尝试将它/ cards /:id呈现为另一个参数 - multiverse_id是我的数据库中的名称。

所以我尝试替换

    def show
   # @card = Card.where(multiverse_id: params[:multiverse_id])
    @card = Card.find(params[:id])
  end

但是,在使用它时,@ card的每次引用都会失败(我有点期待)。

我不太熟悉如何修改路由以修改它以使用:multiverse_id代替。

如果multiverse_id不存在(我有~2,000),我还需要一个回退使用ID。

def show
    if Card.where(multiverse_id: params[:multiverse_id]).nil?
      @card = Card.find(params[:id])
    else
      @card = Card.where(multiverse_id: params[:multiverse_id])
    end
   # @card = Card.find(params[:id])
  end

我尝试了这个逻辑,但我得到了同样的错误。我不确定这个逻辑是否有效,因为路由会查找cards /:id

欢迎任何输入

更新

我尝试了Permalink的建议,但它似乎没有任何效果 - 我检查的每种类型的ActiveDirectory只是查找:id,无论如何。

我确实采纳了使用

的建议
 def show
    if Card.where(multiverse_id: params[:multiverse_id]).nil?
      @card = Card.find(params[:id])
    else
      @card = Card.find_by(multiverse_id: params[:multiverse_id])
    end
   # @card = Card.find(params[:id])
  end

但它仍然每次都返回:id - 我确实注意到ActiveDirectory正在查询multiverse_id,但它运行

  Card Load (0.4ms)  SELECT  "cards".* FROM "cards" WHERE "cards"."id" = ? LIMIT ?  [["id", 15634], ["LIMIT", 1]]
  Card Load (2.0ms)  SELECT  "cards".* FROM "cards" WHERE "cards"."multiverse_id" IS NULL LIMIT ?  [["LIMIT", 1]]

这不是我真正需要的。我应该改变逻辑吗?

再次更新

  def show
    @card = Card.find_by_multiverse_id(params[:multiverse_id]) if params[:multiverse_id]
    @card = Card.find(params[:id]) unless @card.present?

   # @card = Card.find(params[:id])
  end

但不是:id总是会在路线上传递?

但是在仔细考虑之后我需要以不同的方式提出问题。

我的关注

有些卡片没有我提到的Multiverse_IDs,所以我想让它们回滚到:id。但是,目前我的一些ID等于多元ID - 这会导致问题。是否有可能重新填充我的数据库并在rake中以某种方式强制ID等于:multiverse_id如果存在,如果不存在,则成为id?

我的佣金

namespace :cards do 
    desc "Create cards"
    task :create_cards => :environment do
        cards = MTG::Card.all
        cards.each do |card|
            puts card.name + '-' + card.set
            card.image_url.blank? ? image_url = "/assets/mtgCardBack.jpg" : image_url = card.image_url
            Card.create(
                ...
                multiverse_id: card.multiverse_id, 
                ...
                )
        end
    end
end

它填充了更多,但这是唯一的常数。

任何想法都将不胜感激!

2 个答案:

答案 0 :(得分:1)

在你的控制器中试试这个:

@book = Book.find_by_multiverse_id(params[:multiverse_id]) if params[:multiverse_id]

@book = Book.find(params[:id]) unless @book.present?

答案 1 :(得分:0)

使其运作的一种方法是使用permalink模型上的to_param方法参数化Card

class Card < ApplicationRecord
  def to_param
    permalink
  end
  ...
end

然后,在您的控制器上,使用固定链接或id:

if params[:permalink]
  @book = Book.find_by_permalink(params[:permalink])
else
  @book = Book.find(params[:id])
end