(如果这是一个愚蠢的问题,我已经编码了不到一个月,所以道歉)。我有一个用户名模型,电子邮件和类型。我创建了一个索引表单,您可以按类型进行筛选,它应该显示结果。 表格和过滤器显示我有2个问题的预期: 1. usertype是重复的。例如,如果我有5个用户(使用faker gem创建),其中每个用户或供应商,过滤器显示客户和供应商5次而不是两次 2.当我选择过滤器时,会显示所有结果并且不会过滤它们。
这是我的模特:
class User < ActiveRecord::Base
has_many :microposts
scope :by_userType, -> userType { where(:userType => userType) }
这是我的控制器
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
has_scope :by_userType, type: :array #, :using => [:userType]
# GET /users
# GET /users.json
#def index
# @users = User.all
#end
def index
@users = apply_scopes(User).all
end
# GET /users/1
# GET /users/1.json
def show
end
# GET /users/new
def new
@user = User.new
end
# GET /users/1/edit
def edit
end
# POST /users
# POST /users.json
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /users/1
# PATCH/PUT /users/1.json
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# DELETE /users/1
# DELETE /users/1.json
def destroy
@user.destroy
respond_to do |format|
format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_user
@user = User.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def user_params
params.require(:user).permit(:name, :email, :userType)
end
end
这是我的表格:
<p id="notice"><%= notice %></p>
<h1>Listing Users</h1>
<%= form_tag users_path, method: 'get', id: "users_search" do%>
<% @users = User.all %>
<% @users.each do |user|%>
<%= check_box_tag "by_userType[]", user.userType %><%= user.userType %><br>
<% end %>
<%= submit_tag "submit" %>
<% end %>
<div id="users"><%= render 'user_list' %></div>
<script type="text/javascript">
$(function () {
$('input[type=checkbox]').change(function(){
$.get($('#users_search').attr('action'),
$('#users_search').serialize(), null, 'script');
return false;
});
$('users_search').submit(function() {
$.get(this.action, $(this).serialize(), null, 'script');
return false;
});
});
</script>
提前感谢您的时间!
答案 0 :(得分:0)
这里有几件事。首先,欢迎使用rails,欢迎使用Stack Overflow。
+1,用于询问问题并提供您目前为止所做的代码示例。
请注意,对于标准化,案例在rails中很重要。对于范围声明,您应该使用蛇盒。 UserModel是类名,user_model是蛇案。
现在,就实际实施情况而言,我会有所不同。如果您注意到基于某个字段的一个模型的大多数ajax过滤不使用与参数相同的模型,那么它不仅仅是唯一的方式,但我更喜欢它,因为它允许以后灵活地向user_type添加额外的字段。这意味着,如果您将用户类型提取到自己的模型中,那么您可以轻松地从:name
的user_type属性中过滤用户。
所以你的用户模型会有:
class User < ActiveRecord::Base
has_many :microposts
belongs_to :user_type
scope :by_user_type, -> user_type { where(:user_type => user_type) }
end
然后创建一个名为user_model的新模型
rails g scaffold user_model name:string slug:string avatar:string
**请注意,附加字段只是示例,名称只需要一个。但是如果你想让用户进行url搜索,那么slug很容易使用。即yoursite.com/user_type/sellers
现在创建一个迁移来删除用户中现有的userType字段,并删除一个新的关系。
rails g migration modify_user_type_in_user
该文件的内容将是
class ModifyUserTypeInUser < ActiveRecord::Migration
def change
remove_column :users, :userType
add_reference :users, :user_type, index: true
end
end
现在编辑新的user_type.rb
模型并添加users
class UserType < ActiveRecord::Base
has_many :users
end
你还需要使用你在帖子中没有提到的UJS。单击表单域时,它正在发送javascript(ajax)请求。这意味着,为了更改数据,您需要一个javascript响应模板。
所以添加文件app/views/users/index.js.erb
并在其中加入以下内容:
$("#users").html('<%= j(render("user_list", users: @users)) %>');
$("table tbody tr:nth-of-type(even)").css("background","#BD9FB1");
最后,您需要更改表单,因此它代表了正确的可搜索模型。因此,请修改'app / views / users / index.html.erb'
<p id="notice"><%= notice %></p>
<h1>User Filter</h1>
<%= form_tag users_path, method: 'get', id: "users_search" do%>
<% @user_types = UserType.all %>
<% @user_types.each do |user_type|%>
<%= check_box_tag "by_user_type[]", user_type.id %><%= user_type.name %><br>
<% end %>
<%= submit_tag "submit" %>
<% end %>
<div id="users"><%= render 'user_list' %></div>
<script type="text/javascript">
$(function () {
$('input[type=checkbox]').change(function(){
$.get($('#users_search').attr('action'),
$('#users_search').serialize(), null, 'script');
return false;
});
$('users_search').submit(function(e) {
e.preventDefault();
$.get(this.action, $(this).serialize(), null, 'script');
return false;
});
});
</script>