目前在我的路线文件
上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:我不想为此使用任何宝石。
答案 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
这看起来有点复杂,但在我看来是最适合您案例的最佳解决方案。我将在稍后解释:
ActiveRecord::RecordNotFound
但是如果没有设置用户则必须。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
,则为标准。