Ошибка объекта nil при отправке формы в части - PullRequest
0 голосов
/ 29 декабря 2010

Рельсы 2.3.5

У меня проблема, когда выбор формы работает правильно, за исключением того, что при отправке формы я получаю нулевую ошибку в отношении используемого массива. Я не понимаю, как работает тег Select и генерирует правильный HTML, но также выдает нулевую ошибку для массива при отправке формы. Кроме того, если я вынимаю логику из контроллера и вставляю ее непосредственно в партиал, она работает нормально. Спасибо за любую помощь.

В контроллере у меня есть этот код в «новом» методе:

@directories = Directory.find(:all, :conditions => {:id => session[:directories_with_view_access]})
@directories.collect! {|u| [u.name, u.id]}

Внутри партиала для "нового" представления у меня есть этот код:

<%= f.select(:directory_id, @directories, :prompt => 'Select') %>

Который отображает этот HTML-код:

<select id="card_directory_id" name="contact[directory_id]"><option value="">Select</option>
<option value="2">dir_test_1</option>
<option value="4">dir_test_2</option>
<option value="6">dir_test_3</option>

Проблема в том, что при отправке формы я получаю следующую ошибку:

У вас есть нулевой объект, когда вы этого не сделали ожидайте этого! Вы могли ожидать экземпляр массива. Произошла ошибка при оценке nil.inject

Если я возьму логику из контроллера и вставлю ее в частичное, все будет нормально работать:

<%= f.select(:directory_id, Directory.find(:all, :conditions => {:id => session[:directories_with_view_access]}).collect {|u| [u.name, u.id]}, :prompt => 'Select') %>

1 Ответ

1 голос
/ 29 декабря 2010

Использование вами тега выбора здесь не является проблемой.

Я мог бы лучше диагностировать вашу проблему, если бы вы опубликовали трассировку стека, но из того, что вы описали, я думаю, что вашФорма отправляет запрос на публикацию для действия, такого как create, которое, в свою очередь, перенаправляет на страницу, на которой форма снова отображается частично.@directories не устанавливается в перенаправленном действии, которое отвечает за рендеринг представления, как это было установлено в новом действии.

Найдите в своем действии create URL-адрес перенаправления, а затем убедитесь, что @directories установлен в , что action (вполне возможно, действие show, как в redirect_to url_for(@object)), так же, какэто в вашем новом действии.

Ключевым моментом, который необходимо понять, является то, какое действие контроллера фактически обрабатывает ваш запрос POST, какое действие отображает ваше представление и гарантирует, что необходимые переменные там определены.Чтение по маршрутам RESTful необходимо, если вы используете традиционную архитектуру Rails, например, созданную для вас скриптами в script / generate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...