0

我有一个非常基本的登录表单,用户输入他/她的名字(First Last)。

这是表格的ERB代码:

<%= form_for :current_user, url: { :controller => 'application', :action=>'current_user' } do |f| %>
  <%= f.text_field :name, placeholder: 'First Last', :id => 'currentUser' %>
  <%= f.submit 'Submit', :class => 'btn btn-primary' %>
<% end %>

这是 current_user 的操作:

def current_user
  @current_user = User.find_by_name(params[:current_user][:name])
  redirect_to '/calendar'
end

这是它的路线

match 'calendar/signin', to: 'application#current_user', via: 'post'

该表单有效,我通过在 current_user 操作中放置一个调试器对其进行了测试。当我输入它时,params它返回了我输入的用户名。但是一旦它回到/calendar视图@current_user 再次变得未定义。我应该使用什么而不是redirect_to '/calendar'?谢谢

4

1 回答 1

2

作为一般规则,您应该redirect_to使用适当的路径方法进行调用,例如:

redirect_to calendar_path

使用文字 URL 违背了路由系统的目的。如果发生变化,您将需要跟踪所有实例并将其更改/calendar为其他内容。使用路由方法,您可以从实现中更改表示形式,即面向用户的 URL。

同样,您应该urlform_for. 通过控制器和操作调用它是较旧的方法,并且并非没有问题,因为它使用的 URL 并不总是您喜欢的。

您的current_user方法仅@current_user在被调用时分配,并且您的表单需要@current_user提前定义。如果由于某种原因它没有被调用,你的表单将不起作用,没有对象。:current_user是视图上下文中的引用@current_user,其中视图自动从控制器继承实例变量。

通常你会有这样的方法:

def load_current_user
  @current_user = User.find_by(name: ...)
end

然后你触发它一直加载:

before_filter :load_current_user

通常我创建一个需要登录的控制器类,并且所有“仅登录”控制器都从它继承。这样,您应该可以合理地确保您没有未适当限制的页面。

显然,您希望在不需要登录的页面上跳过此操作,例如您登录的会话控制器:

skip_before_filter :load_current_user, only: [ :new, :create ]
于 2013-10-18T14:58:48.040 回答