Rails 3 маршрут -> к #показать. Идентификатор по умолчанию, если ноль?

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

Я хочу направить корень моего проекта к действию books#show. И пусть идентификатор книги будет динамическим.

Но я не хочу, чтобы это влияло на стандартное действие show.

ie … (этот код, конечно, не работает 🙂

   def show
    if  @book.id is present?
        @book = Book.find(params[:id])                       
    else
        @book = Book.first
    end
  end
  

Я надеюсь, что это имеет смысл.

В принципе, я хочу иметь возможность просматривать любую книгу по ее идентификатору. Но если идентификатор не указан, пусть по умолчанию будет Book.first .

Заранее спасибо…

Ответ №1:

Вы близки. Попробуйте использовать params[:id].present? в качестве if условия, и оно должно получить то, что вы хотите.

Вам понадобится root :to => "books#show" маршрут в вашем routes.rb, чтобы заставить его работать.

Однако, с точки зрения ясности, у меня было бы просто два действия: ваше обычное show и home действие, которое выглядит примерно так:

 def home
  @book = Book.first
  render :action => "show"
end

def show
  @book = Book.find(params[:id])
end
  

Затем в вашем routes.rb:

 root :to => "books#home"
  

Это позволит вам сохранить два действия чистыми и более напрямую сообщать о целях этих действий.

Комментарии:

1. Удаляю мой ответ, потому что этот подход более чистый и гораздо более читаемый 🙂

2. Спасибо, Крис! Исправление кода работает. Но имеет абсолютно смысл разделить их… Еще раз спасибо.

3. Извините за это. Это заставляет вас ждать 10 минут, чтобы принять. Итак, я очень быстро выполнил поручение. Идеальный ответ. Еще раз спасибо за вашу помощь…