用户显示路由并向用户显示查询字符串rails

时间:2016-01-08 13:12:44

标签: ruby-on-rails

目前在我的路线文件

miles

我拥有用户资源,并将用户显示为/ users,将单个用户显示为

  resources :users, only: [:show, :index, :update] do
    get :impersonate, on: :member
  end

但根据需要,我想将用户显示为

user GET    /users/:id(.:format)                users#show

在我的show controller中将用户设置为

/users?q=test@test.com

我尝试创建路径为

  def set_user
    @user ||= EvercamUser.find(params[:id])
  end

但是当我尝试match "/users?q=" => "users#show", :via => [:get] 时,它甚至不会转到/users?=test@test.com show控制器的方法,为什么会这样? 我想以两种方式向用户展示。 user/users/19

/users?q=test@test.com

PS:我不想为此使用任何宝石。

6 个答案:

答案 0 :(得分:2)

q=只是一个可以添加到每个网址的参数。

所以你只需要链接到/users的路线,然后再添加一个参数。

get 'users' => 'users#show', as: :show_users

现在,如果您使用路径助手生成链接,则只需将参数传递给它。

例如:show_users_path(q: 'johndoe@example.com')

然后您应该能够使用params[:q]的电子邮件。

要设置用户,我建议您使用以下内容:

class UsersController < ApplicationController
  before_action :set_user, only: :show

  def show
  end

  private

  def set_user
    if id = params[:id]
      @user = EvercamUser.find(id)
    elsif email = params[:q]
      @user = EvercamUser.find_by(email: email)
    end

    raise ActiveRecord::RecordNotFound unless @user.present?
  rescue ActiveRecord::RecordNotFound
    # Do something if no user was set
  end
end

这看起来有点复杂,但在我看来是最适合您案例的最佳解决方案。我将在稍后解释:

  1. 尝试按ID设置用户
  2. 如果找不到ID,则尝试通过电子邮件地址设置一个
  3. 之后它会引发Rails异常ActiveRecord::RecordNotFound但是如果没有设置用户则必须。
  4. 在救援区中,您应该将用户重定向到根页面或返回
  5. 如果ActiveRecord::RecordNotFound方法在数据库中找不到带有ID的记录,也会引发BTW .find

答案 1 :(得分:0)

<强>路线

替换此

match "/users?q=" => "users#show", :via => [:get]

到这个

get "users" => "users#show"
get "users/:q" => "users#show"

<强> CONTROLLER

def set_user
    @user ||= EvercamUser.find(:all, :conditions => ["id = ? or email = ?", params[:q], params[:q]])
end

答案 2 :(得分:0)

您的问题是&#34; / users?q =&#34;一部分。
请按照以下代码再次尝试自己:

match "/users/:q" => "users#show", :via => [:get]

在您的控制器中:

def set_user
  @user ||= EvercamUser.find_by_q(params[:q])
end

(q是列中的一列)用户表。

答案 3 :(得分:0)

我认为你所说的是如果用users#index调用params[:q]动作,那么使用params [:q]通过电子邮件找到用户,如果找到一个,则重定向到节目页面。

def index
  if params[:q] && (user = User.where(email: params[:q]))
    redirect_to user_path(user)
  else
    @users = User.all
  end
end

答案 4 :(得分:0)

我不确定,如果我错了,有人可以纠正我,但我认为你不能像/users?anything这样的路径。

这只是一种预感,但想想如果你试图创建一个带有一些额外属性的路径会发生什么?你最终会得到像/users?something?params这样的东西以及rails如何处理这样的路径?它的行为可能是未定义的,因此无效。

其他人已经给你一个替代方案,所以我不再重复了。

答案 5 :(得分:0)

使用/users?q=test@test.com会将请求发送到索引操作(而不是show操作)。您只需要能够在命中控制器时处理查询字符串:

#app/controllers/users_controller.rb
class UsersController < ApplicationController 
   def index
      if params[:q]
         @users = User.where email: params[:q]
      else
         @users = User.all
      end
   end
end

我认为你正在使用上面的某种“搜索”功能;如果是这样,上面的代码将允许您使用index var填充@users视图:

#app/views/users/index.html.erb
<% @users.each do |user| %>
   <%= user.email %>
<% end %>

您可以使用以下链接:

<%= link_to "Users", users_path(q: "email@email.com") %>

...如果你想制作一个按钮:

<%= button_to "Users", users_path, method: :get, params: { q: "email@email.com" } %>

-

如果您要使用该网址显示特定的用户,则需要将请求发送到show操作(标准功能)(url.com/users/:id) ,如果您在路线中包含resources :users,则为标准。