gpt4 book ai didi

ruby-on-rails - Rails 4 - 动态范围

转载 作者:行者123 更新时间:2023-12-04 07:34:26 26 4
gpt4 key购买 nike

我有一个应用程序,用户可以在其中定义自己的“状态”。然后我创建一个动态范围来处理这个问题。这在本地工作得很好,但是当我推送到 Heroku 时,这不是出于某种原因。

模型:Task.rb:

  Status.all.each do |status|
scope "#{status.name}".downcase.delete(' '), -> { where('status_id = ?', status.id).order('created_at DESC') }
end

路线:routes.rb:
get 'tasks/filters/status/:scope' => "tasks#index"

Controller :tasks_controller.rb:

如果用户从 View 中点击状态,则落入 else阻止并运行 if params[:scope]部分并执行 @tasks = Task.send(params[:scope]) :
  def index
@statuses = Status.all.order('name')
if params[:tag]
@tasks = Task.tagged_with(params[:tag])
else
if params[:scope]
@tasks = Task.send(params[:scope])
elsif params[:showall]
@tasks = Task.all.order('created_at DESC')
else
@tasks = Task.all.where('assigned_to = ?', current_user).order('created_at DESC').
reject { |t| t.status.default_view != true }
end
end
end

正如我所说,当我使用 rails s 在本地运行时,这非常有效。 ,但是当我推送到 Heroku 时,出现错误。运行 heroku logs揭示了这一点:
2015-06-17T15:06:07.769748+00:00 app[web.1]:   Parameters: {"scope"=>"open"}
2015-06-17T15:06:07.895996+00:00 app[web.1]: Role Load (1.4ms) SELECT "public"."roles".* FROM "public"."roles" WHERE "public"."roles"."id" = $1 LIMIT 1 [["id", 1]]
2015-06-17T15:06:07.907046+00:00 app[web.1]: ArgumentError (wrong number of arguments (0 for 1+)):
2015-06-17T15:06:07.907043+00:00 app[web.1]:
2015-06-17T15:06:07.907050+00:00 app[web.1]:
2015-06-17T15:06:07.907048+00:00 app[web.1]: app/controllers/tasks_controller.rb:12:in `index'
2015-06-17T15:06:07.907049+00:00 app[web.1]:
2015-06-17T15:06:07.972702+00:00 app[web.1]: Started GET "/tasks/filters/status/open" for 173.27.229.45 at 2015-06-17 15:06:07 +0000
2015-06-17T15:06:07.998359+00:00 app[web.1]: Completed 500 Internal Server Error in 23ms

tasks_controller.rb 中的第 12 行是:
@tasks = Task.send(params[:scope])

是什么赋予了?它说 ArgumentError (wrong number of arguments (0 for 1+)) ,但第一个条目清楚地表明参数“范围”设置正确(在本例中为“打开”)。

最佳答案

尽管我不确定为什么它在开发中有效,但在生产中无效,正如@PerfectlyNormal 指出的那样,我这样做的方式存在安全风险。

我想我有点过度思考如何做到这一点。我想出了这种方式,它似乎工作正常:

  def index
@statuses = Status.all.order('name')
@priorities = Priority.all.order('name')
@products = Product.all.order('name')
if params[:status_id]
@tasks = Task.all.where("status_id = ?", params[:status_id])
elsif params[:priority_id]
@tasks = Task.all.where("priority_id = ?", params[:priority_id])
elsif params[:product_id]
@tasks = Task.all.where("product_id = ?", params[:product_id])
elsif params[:tag]
@tasks = Task.tagged_with(params[:tag])
elsif params[:all_tasks]
@tasks = Task.all
else
@tasks = Task.all
end
end

然后在我看来(它使用我编写的一个简单的帮助程序将其显示为 Bootstrap 3 标签,具体取决于用户选择的颜色):
          <% @statuses.all.each do |status| %>
<%= link_to "/tasks/filters/status/#{status.id}" do %>
<%= filter_status(status) %>
<% end %>
<% end %>

最后在我的 routes.rb :
get 'tasks/filters/status/:status_id' => "tasks#index"
get 'tasks/filters/priority/:priority_id' => "tasks#index"
get 'tasks/filters/product/:product_id' => "tasks#index"

关于ruby-on-rails - Rails 4 - 动态范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30895602/

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