我正在尝试解决这个问题:
假设您有两个模型,其中:
:酒吧有_很多:foos
你有一个像这样的网址:http://myapp.com/24-name-of-the-bar-to-param/foos/new http://myapp.com/24-name-of-the-bar-to-param/foos/new
在我的网站上,此页面显示了有关用户将为其创建 foo 的栏的大量信息。因此,即使用户未登录,用户仍然可以看到该信息。
目前,当用户登录时,用于创建新 foo 的表单位于网页的左侧。当用户未登录时,它会显示“请登录或注册”
该表单解释了很多有关我的应用程序如何工作的信息,因此我想对其进行更改,以便即使用户未登录,也会显示该表单,并且如果他们单击“提交”,则会将他们带到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
在 foo 的创建操作上调用此登录所需的操作。当我点击表单上的“提交”时,它会带我去http://myapp.com/foos http://myapp.com/foos代替http://myapp.com/24-name-of-the-bar-to-param/foos/new 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