Я пытаюсь разобраться в этом:
Скажем, у вас есть две модели, где:
: bar has_many: foos
И у вас есть URLкак это: http://myapp.com/24-name-of-the-bar-to-param/foos/new
На моем сайте эта страница показывает много информации о панели, для которой пользователи собираются создавать foo.Таким образом, даже если пользователь не вошел в систему, он все равно сможет видеть информацию.
В настоящее время, когда пользователь вошел в систему, форма для создания нового foo находится слева.веб-страницы.Когда пользователь не вошел в систему, он говорит: «Пожалуйста, войдите или зарегистрируйтесь»
Форма многое объясняет о том, как работает мое приложение, поэтому я хотел бы изменить его так, чтобы даже если пользователь невошедшая в форму будет отображаться, и если они нажмут кнопку отправки, они перенесут их в логин_путь, а затем, когда они войдут в систему, вернутся к пути, по которому была отправлена форма.У меня в контроллере приложения есть метод login_required, подобный следующему:
def store_location
session[:return_to] = request.request_uri
end
def login_required
unless current_user || admin?
store_location
flash[:notice] = "Please log in"
redirect_to login_path and return false
end
end
Это обязательное для входа действие вызывается при создании действия foo.Когда я нажимаю кнопку «Отправить» в форме, я получаю http://myapp.com/foos вместо http://myapp.com/24-name-of-the-bar-to-param/foos/new
Я предполагаю, что это связано с тем, что необходимая функция входа в систему вызывается в действии создания, а не в новом действии.
Любые идеи?
ОБНОВЛЕНИЕ согласно запросу здесь код контроллера и обратные вызовы:
before_filter :find_bar, :except => [:index, :edit, :update]
before_filter :login_required, :only => [:create]
ssl_required :edit, :update
def new
@foo = Foo.new :amount => "0.00"
@foos = Foo.find(:all, :conditions => ["bar_id = ?", @bar.id], :order => "created_at DESC").paginate :page => params[:page], :per_page => 10
@foos_all = Foo.find(:all, :conditions => ["hatlink_id = ?", @hatlink.id], :order => "created_at DESC")
@current_user = current_user
@topfooers = User.bar_amount(@bar, nil)
@average_foo = @bar.foos.average('amount')
end
def create
@foo = @current_user.foos.build params[:foo]
if (@bar.foos << @foo)
flash[:notice] = "Thank you for fooing!"
redirect_to new_bar_foo_path(@bar)
else
render :action => :new
end
end
private
def find_bar
@bar_id = params[:bar_id]
return(redirect_to(categories_path)) unless @bar_id
@bar = Bar.find(@bar_id)
end