gpt4 book ai didi

ruby-on-rails - 在 Rails 中,使用 check_box_tag,如何在提交查询后保持选中复选框?

转载 作者:数据小太阳 更新时间:2023-10-29 08:16:37 25 4
gpt4 key购买 nike

好的,我知道这是针对 Saas 类(class)的,人们也一直在问与此相关的问题,但我花了很多时间尝试和阅读,但我被卡住了。首先,当你有一个名为 Movie 的模型时,最好使用 Ratings 作为模型并将它们关联起来,还是只将 Ratings 保留在一个 float 在空间(!)的数组中。其次,这是我现在在我的 Controller 中的内容:

def index

@movies = Movie.where(params[:ratings].present? ? {:rating => (params[:ratings].keys)} : {}).order(params[:sort])
@sort = params[:sort]
@ratings = Ratings.all

end

现在,我决定创建一个评级模型,因为我认为它会更好。这是我的观点:

= form_tag movies_path, :method => :get do

Include:
- @ratings.each do |rating|
= rating.rating
= check_box_tag "ratings[#{rating.rating}]"
= submit_tag "Refresh"

我尝试了所有与在以“.include?(rating) ? true :”结尾的复选框标记内使用条件三元相关的所有方法确切的答案,我只需要指导。提前致谢!

更新( Controller 的方法):

为了清楚起见,这是我的 Controller 中正在读取此散列的索引方法。对于之前的模糊,我深表歉意。

def index    
@all_stores = Product.all_stores
@selected_stores = params[:stores] || session[:stores] || {}

if @selected_stores == {}
@selected_stores = Hash[@all_stores.map {|store| [store, store]}]
end
if params[:stores] != session[:stores]
# session[:stores] = @selected_stores
session[:stores] = params[:stores]
redirect_to :stores => @selected_stores and return
end
@products = Product.order("created_at desc").limit(150).find_all_by_store(@selected_stores.keys).group_by { |product| product.created_at.to_date}
. . . etc

最佳答案

一些事情

1) .order(params[:sort]) 让你容易受到 sql 注入(inject)攻击,有人可能会通过将其放入查询字符串中来删除您的所有用户

http://localhost:3000/movies?sort=email%3B+DELETE+from+users+--

参见 rails 3 activerecord order - what is the proper sql injection work around? , .where 不存在这个问题,rails 会清理 where 方法的输入

2) 小事,AREL 会延迟对数据库的实际调用,直到您迭代集合,因此您可以“构建”查询,这种语法可能比使用三元运算符更容易理解?

@movies = Movie.order(xxxxxx)
@movies = @movies.where(:rating => params[:ratings].keys) if params[:ratings].present?

3) 对于你的评分,就像 cdesrosiers 所说的常数是好的,然后是你的观点

Movie::RATINGS.each do |rating|
check_box_tag "ratings[]", rating # <input type="checkbox" name="ratings[]" value="PG" />

编辑:保持选定的值

# controller
@selected_ratings = (params[:ratings].present? ? params[:ratings] : [])

# view
Movie::RATINGS.each do |rating|
check_box_tag "ratings[]", rating, @selected_ratings.include?(rating)
# <input type="checkbox" name="ratings[]" value="PG" checked="checked" />

请注意复选框命名中的 [],这将在您的 Controller 操作中为您提供 params[:ratings] 作为数组

@movies = @movies.where("rating IN (?)", params[:ratings]) if params[:ratings].present? and params[:ratings].any?

一些链接

关于ruby-on-rails - 在 Rails 中,使用 check_box_tag,如何在提交查询后保持选中复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10972300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com