Маршрутизация Rails - необязательные параметры не работают

У меня есть код ниже в моем файле route.rb:

get 'page/contact_us(/:year(/:month))'=>'page#contact_us', :as => 'contact_us'

Идея состоит в том, что указывать год и месяц в URL-адресе необязательно. Но всякий раз, когда я пытаюсь перейти по адресу:

localhost:3000/page/contact_us

Я получаю сообщение об ошибке. Только когда я ввожу и год, и месяц, я не получаю ошибки. Например,

localhost:3000/page/contact_us/2014/11

работает!

Rails сообщает мне, что ошибка в файле contact_us.html.erb. Строка ошибки:

<%=contact_us(@month,@year).html_safe%>

Функция contact_us(месяц, год) определена во вспомогательном файле - page_helper.rb

Идея заключается в том, что выше (в URL) обычно передаются 2 аргумента, но иногда в URL может передаваться 1 аргумент или вообще не передаваться. Я получаю сообщение об ошибке, когда передается менее двух аргументов.

Пожалуйста помоги! Я использую рельсы 4.1.8 и Rubymine.


person raneshu    schedule 20.11.2014    source источник
comment
contact_us_path(@year) у меня работает, как и contact_us_path без аргументов.   -  person Victor Moroz    schedule 20.11.2014
comment
Если params[:month] и params[:year] не определены (и их не будет, если вы не передадите их в URL-адресе). Тогда чем вы заполняете @month и @year? Что происходит в вашем коде, если @month и @year равны нулю?   -  person JTG    schedule 20.11.2014
comment
Спасибо. params[:month] и params[:year] предназначены для запросов GET. Например, что-то вроде: localhost:3000/page/contact_us?month=10&year=2012.   -  person raneshu    schedule 20.11.2014
comment
Можем ли мы увидеть вспомогательный метод? А собственно ошибка?   -  person Michael Cruz    schedule 20.11.2014
comment
Фактическая ошибка: ‹%=calendar(@month,@year).html_safe%›//Неверная дата   -  person raneshu    schedule 20.11.2014
comment
Вспомогательный метод находится здесь: codeshare.io/V6muo   -  person raneshu    schedule 20.11.2014
comment
Я думаю, вы передаете @ month или @year как ноль, а затем пытаетесь создать новый объект даты в своем вспомогательном методе с nil в качестве месяца или года, переопределяя значения по умолчанию, которые он может иметь, и создавая недействительную дату. Попробуйте сделать необязательные параметры или добавить строку, чтобы установить месяц и год по умолчанию, если они равны нулю.   -  person Michael Cruz    schedule 20.11.2014
comment
Спасибо. как добавить необязательные параметры?   -  person raneshu    schedule 20.11.2014
comment
Я думал, что это утверждение: get 'page/contact_us(/:year(/:month))'=›page#contact_us, :as =› 'contact_us', которое находится в route.rb, делает год и месяц необязательными. Я думал, что скобки вокруг года и месяца делают его необязательным. Нет? @МайклКруз   -  person raneshu    schedule 20.11.2014


Ответы (1)


Ваша ошибка неверной даты исходит из метода календаря, который вы включили в свои комментарии. У вас есть:

def calendar(month, year)

  current_date = Date.new(year, month, 1)
  ...

Проблема в том, что если месяц или год равны нулю, вы в основном делаете это (в данном случае, предполагая, что оба значения равны нулю):

current_date = Date.new(nil, nil, 1)

Просто запустите консоль rails и попробуйте: вы получите эту ошибку - TypeError: нет неявного преобразования из nil в integer.

Так что проблема не в вашем URL, а раньше. Вы можете добавить несколько таких строк, чтобы исправить эту ошибку:

def calendar(month, year)
  month ||= 1
  year ||= 1900
  current_date = Date.new(year, month, 1)
  ...

... но тогда вам придется отслеживать тот факт, что это неправильные даты, чтобы они не передавались в URL-адресе, где бы это ни происходило.

person Michael Cruz    schedule 20.11.2014