2016-01-31 2 views
2

Что привело бы к тому, что переменная экземпляра @product не будет установлена ​​/ передана для перенаправления. Продукт является объектом ActiveModel, а не ActiveRecord. более конкретно, переменная @product не появляется на страницах redirect_to (new_services_path) или redirect_to (home_path). Поскольку переменной @product необходимо заполнить форму в нижнем колонтитуле, который находится на каждой странице.Переменная экземпляра, не заданная с перенаправлением

application_controller:

class ApplicationController < ActionController::Base 
    before_filter :set_product 

    private 

    def set_product 
    @product ||= Product.new 
    end 
end 

Product_controller:

def new 
    end 


def create 
    @product = Product.new(params[:product]) 

    if @product.category == "wheels" 
     redirect_to(new_services_path) 
    else 
     redirect_to(home_path) 
    end 
    end 

вопрос, связанный с этим исходным сообщением .. Passing variables through multiple partials (rails 4)

+0

@Product ... возможно @product? – henb

+0

, что было ошибкой в ​​stackoverflow. починил это. – user2012677

+0

Я не совсем понимаю, чего вы хотите, но это http://ideone.com/GXHLp6 может решить вашу проблему. – henb

ответ

3

переменных экземпляра не передаются редирект.

Следовательно, у вас нет объекта @product в то время, когда вы достигаете before_filter, и поэтому вы просто создаете новый и пустой объект Product каждый раз.

объекты ActiveModel не могут сохраняться от сеанса к сеансу, но вы можете сохранить атрибуты в вашей сессии хранить и использовать, что в вашем before_filter

def set_product 
    @product = Product.new(session[:product]) if session[:product] 
    @product ||= Product.new 
end 

И в методе создания перемещения формы Params к сессия ...

def create 
    session[:product] = params[:product] 
    set_product 
    if @product.category == 'wheels' 
    --- 

Обратите внимание, что мы назвали set_product явно в методе создания, так как сеанс [: продукт] был воссоздан.

В случае, если вам интересно, почему переменная экземпляра теряется ... в методе create вы находитесь в экземпляре ProductController, и этот экземпляр имеет свои собственные переменные экземпляра. Когда вы перенаправляете, вы поручаете рельсам создавать NEW-экземпляр какого-либо другого (или того же) контроллера и этого нового объекта контроллера, он не имеет установленных переменных экземпляра.

+0

Это правильный ответ :) –

+0

Отличный ответ, спасибо. Нужно ли беспокоиться об уничтожении сеанса? – user2012677

2

Чтобы добавить к ответу SteveTurczyn, вам необходимо прочитать около object orientated programming. После того, как я сделал, все переменные вещи понятнее.

enter image description here

Very good write-up


Рубин является объектно-ориентированным, то есть каждый раз, когда вы посылаете запрос, он должен вызывать все относительные объекты (классы) для вас, чтобы взаимодействовать с:

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

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

#app/controllers/your_controller.rb 
class YourController < ApplicationController 
    def edit 
     @model = Model.find params[:id] 
    end 

    def update 
     @model = Model.find params[:id] #-> new request = new instance 
    end 
end 

-

Таким образом, когда вы спрашиваете ...

@product переменной необходимо заполнить форму в нижнем колонтитуле, который находится на каждой странице.

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

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    before_filter :set_product 

    private 

    def set_product 
    @product ||= Product.new #-> after "create", params[:product] = nil (new instance) 
    end 
end 

@SteveTurczyn получил его, когда он упомянул сдачи данных в сессии. В соответствии с docs ...

HTTP - stateless protocol. Сессии делают его сдержанным.

0

Решение, упомянутое Стивом, будет работать для меньшего количества данных, но как насчет получения некоторых записей и передачи его с помощью redirect_to. Сессия не позволяет нам много места.

Что я сделал, так это то, что я установил эти записи в флеш-объекте и, когда он перенаправлен на флэш-страницу, визуализировал данные для меня успешно.

flash[:products] = @products 
redirect_to users_path 

Позвольте мне знать, как это работает ...

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