2014-10-24 5 views
0

У меня есть форма, которая используется как моими новыми, так и редактируемыми шаблонами для модели под названием product. В моем контроллере для действий по созданию и обновлению он перенаправляется на @product и затем демонстрирует «шоу» при успешном завершении. Это отлично работает, когда форма объявляется с помощью `form_for @product do | f |, но если вместо переменной экземпляра используется символ, он пытается отправить POST на ту же страницу. И.Е. Если бы я был на странице products/4/edit и я нажал кнопку submit в форме, это дало бы мне ошибку маршрутизации, которая пыталась выполнить POST-продукты/4/edit, которая имеет только маршрут GET в ресурсах.Почему символ form_for: возвращается на ту же страницу?

Теперь, если я поставлю опцию url «url: products_path», она правильно перенаправляет продукты/4, как если бы я использовал form_for @product. Означает ли это, что использование символа с form_for не идет на мои действия с контроллером? Почему пытается POST для себя?

Вот форма

<%= form_for @product do |f| %>  <-- Changing this to :product gives routing error 
    <% if @product.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2> 

     <ul> 
     <% @product.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %><br> 
    <%= f.text_area :description, rows: 6 %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

и вот мои действия контроллера для обновления и создания:

def create 
    @product = Product.new(product_params) 

    respond_to do |format| 
     if @product.save 
     format.html { redirect_to @product, notice: 'Product was successfully created.' } 
     format.json { render :show, status: :created, location: @product } 
     else 
     format.html { render :new } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @product.update(product_params) 
     format.html { redirect_to @product, notice: 'Product was successfully updated.' } 
     format.json { render :show, status: :ok, location: @product } 
     else 
     format.html { render :edit } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

ответ

1

При использовании символа в форме для этого в основном говорит form_builder, какой тип объекта вашего создают форму для. Если существует переменная экземпляра, например, @product, тогда форма достаточно умна, чтобы отображать значения при визуализации входных переменных. Однако для того, чтобы правильный URL-адрес для пути определялся с помощью находчивой маршрутизации rails, вам необходимо передать ресурс.

@продукт не совпадает с продуктом. Переменная экземпляра отражает ресурс в вашей системе, поэтому для него может быть создан находчивый маршрут. Это не тот случай, когда используется символ, поэтому необходимо явно указать параметр url.

при использовании: product url формы action задает URL-адрес текущей страницы, поэтому ваша подача идет к вашему действию редактирования.

+0

А, я так и думал! Спасибо за разъяснения –