Я пытаюсь получить голову вокруг этого:
Скажите, что у Вас есть две модели где:
:bar has_many: foos
И у Вас есть URL как это: http://myapp.com/24-name-of-the-bar-to-param/foos/new
На моем сайте эта страница показывает большую информацию о панели, для которой пользователи собираются создать нечто. Так, даже если пользователь не будет зарегистрирован, то пользователь все еще сможет видеть информацию.
В настоящее время, когда пользователь зарегистрирован, форма для создания нового нечто имеет на левой стороне веб-страницу. Когда пользователь не зарегистрирован, это говорит, "Войдите в систему или зарегистрируйтесь"
Форма объясняет много о том, как мое приложение работает, таким образом, я хотел бы изменить его так, чтобы, даже если пользователь не зарегистрирован, форма отобразилась, и если они нажимают, утверждают, что это возьмет их к login_path и затем когда они войдут в систему, назад к пути где отправленный форма.
Я сталкиваюсь с этой проблемой: В настоящее время у меня есть 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
Этот вход в систему потребовал, чтобы действие назвали на действии по созданию нечто. Когда я нажимаю, отправляют на форме, она берет меня на 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
Глупо с моей стороны находить решение всего через пять минут после публикации вопроса. Ну, вот что я сделал (и это работает).
В «новом» действии foo я добавил эти строки
if !current_user
store_location
end
В методе, необходимом для входа в систему, я добавил следующее:
if params[:controller] == "foos" && params[:action] == "create"
#Took out the line for storing the location in this method.
flash[:notice] = "Please log in"
redirect_to login_path and return false
Можно хранить ссылающийся url (если он есть) и перенаправлять на эту страницу, если запрос был POST или PUT. Что-то вроде:
def store_location
if request.post? || request.put?
session[:return_to] = request.env['HTTP_REFERER']
else
session[:return_to] = request.request_uri
end
end