Ruby on Rails: Вложенные Атрибуты, belongs_to отношение

Кажется, что кнопка, которая используется в качестве OK или Кнопки отмены для ModalPopupExtender, не может иметь события щелчка. Я проверил это путем удаления

OkControlID="ModalOKButton"

от тега ModalPopupExtender и огней нажатия кнопки. Я должен буду выяснить другой способ отправить данные на сервер.

9
задан simaob 23 July 2017 в 21:06
поделиться

4 ответа

The exact problem you're facing, as others have pointed out is that your controller is not receiving the location id as it should. Looks to me the location id is being passed through the wrong parameter. Unfortunately a location id doesn't exist on a new record, so this is not possible in the form.

Your problem stems from the use accepts_nested_attributes_for on a belongs_to relationship. The behaviour isn't clearly defined. This appears to be a documented bug. So the accepts_nested_attributes_for should be on a has one or has many side of a relationship.

Here are some possible solutions:

  1. Move The accepted_nested_attributes_for to the Location model and build your forms the other way around.

    -form_for @location do |location_form|
     ...
     = location_form.fields_for @user do | user_form |
     ....
    

    К сожалению, это не позволяет логически представить информацию. И затрудняет редактирование нужного пользователя.

  2. Используйте модель соединения и создайте одну: через отношения.

    Я честно не уверен, насколько хорошо accept_nested_attributes_for работает с отношениями: через, но это определенно решит ваши проблема со связыванием записей.

  3. Игнорировать accept_nested_attributes_for и обрабатывать ассоциацию в вашем контроллере старомодным способом.

    Фактически оставьте accept_nested_attributes_for. Он предоставляет несколько удобных и удобных методов, только не позволяйте ему добраться до оператора update_attributes / create.

     def update
     @user = @current_user 
     завершено = ложь
     location_params = params [: user] .delete (: current_location_attributes)
    
     User.transaction делать
     @location = Location.find_or_create_by_id(location_params)
     @user.update_attributes(params[:user]) 
     @user.current_location = @location
     @user.save!
     completed = true
     end
     if completed
     flash[:notice] = "Account updated!" redirect_to account_url 
     else 
     render :action => :edit 
     end
    end
    

Поля для автоматически заполняют поле идентификатора в хэше current_location_attributes, если это не создает новое местоположение. Однако для работы find_or_create_by_id требуется запись: id в хеше. Он будет создан с правильно автоматически увеличивающимся идентификатором, если идентификатор отсутствует в базе данных. Если вы создаете новое местоположение, вам нужно будет его добавить. Проще всего добавить его в форму с помощью = location_form.hidden_field: id, 0, если только текущий \ _location.new \ _record? .

Тем не менее, вы можете сократить количество дублирующих локаций и изменить строку Location.find_or_create_by_id на Location.find_or_create_by_location. Это также сократит количество ошибок из-за неудачных проверок уникальности.

9
ответ дан 4 December 2019 в 21:50
поделиться

You do not provide the nested attribute's id. So rails thinks it's a new one.

- form_edit.fields_for :current_location do |location_form|
    = location_form.label :location, "Current Location"
    = location_form.text_field :location
    = location_form.hidden_field :id unless location_form.new_record?
0
ответ дан 4 December 2019 в 21:50
поделиться

By default belongs_to :current_location, :class_name => 'Location' will expect the Users table have a current_location_id field. Once you have this you should be able to do something like:

@user = @current_user
@user.update_attributes(params[:user])

@location = @user.current_location or @user.build_current_location
@location.update_attributes(params[:location]) 

@user.current_location.save!
@user.save!
0
ответ дан 4 December 2019 в 21:50
поделиться

Не уверен, что предыдущий ответ действительно правильный. Вам нужно указать идентификатор пользователя для местоположения, а не само местоположение.

- form_edit.fields_for :current_location do |location_form|
  = location_form.label :location, "Current Location"
  = location_form.text_field :location
  = location_form.hidden_field :user_id
0
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: