2014-08-28 4 views
0

У меня есть две моделиRoR - Новое действие обновление

 
Client.rb 
    has_many :addresses 
    accepts_nested_atributes_for :addresses 


Address.rb 
    has_many :addresses 

Я создал новое действие update_establishments на ClientsController, чтобы добавить новые учреждения к клиенту.

 
ClientsController.rb 

    #the corresponding view of this action will render the locations_form 
    def add_establishments 
    @client = Client.find(params[:id]) 
    @client.addresses.build 
    end 

    def update_establishments 
    create_zip 
    respond_to do |format| 
     if @client.update(client_params) 
     set_zip 
     format.html { redirect_to @client, notice:'Establishment added.'} 
     format.json {head :no_content} 
     else 
     format.html { render action: 'edit'} 
     format.json { render json: @client.error, status: :unprocessable_entity } 
     end 
    end 
    end 


locations_form 

    %= form_for @client, :url=>{:action=>'update_establishments'}, html:{ :method =>"patch"} do |form| %> 

У меня есть два вопроса:

1 - Когда форма оказывается, форма представления двух отдельных полей для адресов, один, содержащий значения существующего адреса, а другой, чтобы добавить новый , Как я могу представить не существующие адреса?

2 - Это дает явную ошибку в действии update_establishments, потому что @client - ничто. Есть ли способ отправить клиент из формы в действие или мне нужно добавить скрытые поля со значениями?

ответ

1

Вопрос 1, когда вы звоните @client.addresses.build, он создает третий адрес для клиента. Я предполагаю, что вы показываете все три адреса в форме.

Вопрос 2, вы хотите отправить идентификатор клиента с запросом и использовать его для поиска клиента.

Следующие проблемы должны решить обе проблемы.

Как можно больше - и это почти всегда возможно - попытайтесь придерживаться standard Rails controller actions. Нестандартное действие контроллера, например add_establisments или update_establishments, как правило, является признаком того, что существует более «Rails» способ моделирования ваших контроллеров.

В этом случае я задал вопрос, почему ClientsContoller обрабатывает предприятия. Если вы добавите EstablishmentsController, я предполагаю, что все начнет работать. Вот как это сделать:

В config/routes.rb создайте ресурс клиентов с ресурсом вложенных ресурсов.

resources :clients do 
    resources :establishments 
end 

Это даст вам некоторые nested routes, которые начинаются с/клиентов /: CLIENT_ID/учреждения.

Создайте EstablishmentsController и переместите add_establishments и update_establishments. Переименуйте add_establishments в new и переименуйте update_establishments в update. Также переместите соответствующие представления в/views/facility// и переименуйте их в соответствии с их новыми именами действий.

Если нет причин для поиска клиента в действии new, вы можете просто создать новое заведение, чтобы перейти к представлению. В любом случае ваша форма будет связана с этим новым учреждением, а не с существующим клиентом. (Вопрос 1)

В update вы можете использовать параметр :client_id, чтобы найти клиента. (Вопрос 2) update понадобится немного массажа, но мне нужно знать, действительно ли вы обновляете сразу несколько заведений или просто одно учреждение, чтобы сказать, как это будет выглядеть. (Вы не будете обновлять @client сам, но учреждения клиента.)

+0

Я больше всего использую ваш ответ, который заставлял меня думать о других способах создания моделей.Однако у меня есть новое сомнение в том, что я хотел бы, чтобы вы взглянули, если вы можете http://stackoverflow.com/questions/25595309/ror-create-record-on-many-to-many-join-table. Спасибо за ваше время – NunoRibeiro

Смежные вопросы