Как передать (или сериализовать?) Объект ActiveRecord в скрытую переменную? - PullRequest
0 голосов
/ 20 ноября 2011

RoR известен как «соглашение о конфигурации», поэтому, скорее всего, мой вопрос снят - я не знаю соглашения, которому я должен следовать.

У меня есть 2 объекта модели, ParseException и ParseResolution, и ParseResolution belongs_to ParseException.

Я просто делаю админ-панель из лесов Rails и хочу добавить новый объект ParseResolution, связанный с объектом ParseException.

После генерации контроллеров для обеих моделей я добавил ссылку на parse_resolution/new из parse_exception/index. Поскольку ParseResolution необходимо знать, какое ParseException оно разрешает (own_to), я также передаю его в качестве параметра:

<td><%= link_to 'Add Resolution', new_parse_resolution_path(:parse_exception => parse_exception) %></td>

Пока все хорошо.

В моем контроллере ParseResolution у меня есть:

def new
  @parse_resolution = ParseResolution.new
  @parse_resolution.parse_exception = ParseException.find(params[:parse_exception])

  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @parse_resolution }
  end
end

Пока все хорошо, так как я могу получить доступ к объекту ParseException внутри моего файла ERB и отобразить его детали.

Однако, когда я нажимаю кнопку «Создать», чтобы добавить свой новый объект ParseResolution, метод save жалуется, что я не предоставляю ему ParseException, который является обязательным столбцом.

Я пытался сделать это со скрытым полем:

<%= hidden_field(:parse_resolution, :parse_exception) %>

Но это просто преобразует объект ParseException в строку:

<input id="parse_resolution_parse_exception" name="parse_resolution[parse_exception]" type="hidden" value="#&lt;ParseException:0x1108a8930&gt;" />

Что явно не сработает.

ОК, поэтому я снова пытаюсь не ненавидеть Ruby on Rails за все его вуду-подобные соглашения. Может, кто-нибудь расскажет мне, как лучше всего делать то, что я пытаюсь сделать?

1 Ответ

2 голосов
/ 20 ноября 2011

Если вы хотите следовать передовым практикам, вы должны сделать что-то вроде этого:

Ваши маршруты к новым действиям, действиям по созданию, уничтожению должны выглядеть следующим образом:

parse_exceptions/:parse_exception_id/parse_resolutions/new

в маршрутах. Это будет:

  resources :parse_exceptions do
    resources :parse_resolutions
  end

и тогда ваш путь к новым действиям должен быть примерно таким:

new_parse_exception_parse_resolution_path (@parse_exception)

(вам также нужно изменить путь для создания действия в форме)

Тогда в вашем контроллере ParseResolutions:

before_filter :load_parse_exception
.
def new
  @parse_resolution = @parse_exception.parse_resolutions.new
end

def create
  @parse_resolution = @parse_exception.parse_resolutions.new(params[:parse_collection]
  .
  .
end
private
def load_parse_exception
  @parse_exception = ParseException.find params[:parse_exception_id]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...