Select_tag登录

时间:2014-07-01 16:31:34

标签: ruby-on-rails sqlite ruby-on-rails-4

我想有一个下拉菜单,其中包含db中所有用户名的列表。从那里,我希望用户选择他/她的名字,并能够点击登录并被带到他们各自的页面。此时,不需要密码。目前,我有以下内容:

控制器:

def login
  @user = User.new
  @users = User.all

  # @user = User.find_by_id(:id)
  # redirect_to user_path(@user)
end

视图:

<%= form_for @user, url: '/login', html: {method: 'get'} do |f| %>
  <%= f.label "Name" %>
  <br/>
    <%= select_tag :user, options_for_select(@users) do |users| %>
      <%= link_to users.name, users %>
    <% end %>
  <br/>
  <br/>
  <%= f.submit 'Login' %>
<% end %>

我似乎无法将用户链接到他们的路径,我还想在下拉菜单中显示用户名。目前,它显示了一个十六进制指针。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

你不应该在这里创建一个新的User对象:你只想从数据库中加载一个。你想在控制器中做的只是将current_user设置为现有用户之一,对吧?

此外,您已将表单提交回加载表单的操作,这看起来很奇怪。我会让它提交给一个新的动作,比如&#34; set_current_user&#34;这是一个POST动作。

在您的登录模板中:

<%= form_tag '/set_current_user' do %>
  <%= f.label "Name" %>
  <br/>
    <%= select_tag "user_id", options_for_select(@users.collect{|user| [user.name, user.id] } %>
  <br/>
  <br/>
  <%= submit_tag 'Login' %>
<% end %>
在控制器中

(您需要修改routes.rb以使&#39; / set_current_user&#39;转到此操作)然后您需要设置一些将保持用户登录的内容。传统方法是通过session[:user_id],并使用方法current_user来使用此方法。

def set_current_user
  session[:user_id] = params[:user_id]
  redirect_to "/" and return
end

您的初始方法让人想起通常如何处理此类事情,其中​​执行具有form_for,但它适用于UserSession对象而不是User对象。