0

我正在尝试Task从数据库中生成一个随机数并将其呈现在页面上。

在主页上,我有:<%= link_to 'gen task', :action => :random_task %>

在控制器中我有这两种方法:

def show_random_task
@task = Task.find(params[:task])
end 

def random_task
    begin
      @task.id = nil
      @task = Task.find(rand(Task.first.id..Task.last.id)) rescue "Item couldn't been randomized!"
    end
    respond_to do |format|
      format.html {redirect_to show_random_task}
    end
end

show_rand_task.html.erb

<h1>Generated task</h1>
<% random_task %>
<%= form_for (:task, :url => {:action =>'show_random_task'}) do |f|%>

  <p><%= render(:partial => "show_rand_task_form", :locals => {:f => f}) %></p> 
<%end%>
</div>

<%= link_to 'Show', @task %> |
<%= link_to 'Back', tasks_path %>

自定义表单是_show_rand_task_form。我的问题是:我在哪里无法通过随机 id 来显示它。为什么我在show方法上出现错误,因为我没有调用它。

 ActiveRecord::RecordNotFound in TasksController#sho
    Couldn't find Task with id=random_task
    Rails.root: xxxxxx
    app/controllers/tasks_controller.rb:16:in `show'

PS:我是新来的Rails。

4

2 回答 2

1

对随机任务 url 使用重定向是个好主意。我认为这样的序列可以通过更简单的代码来处理:

# in TasksController
def show
  if params[:id] == 'random'
    # order should be RAND() for Mysql, and RANDOM() for Postgres
    # there are better ways of doing it, but for this simple example:
    task = Task.order('RAND()').first
    redirect_to task
  else
    @task = Task.find(params[:id])
  end
end

然后在视图中,您可以放置​​:

<%= link_to 'random task', task_path(:random) %>

如果您所做的只是随机选择预先存在的记录,我不明白您为什么在这里需要表格。

于 2012-09-10T21:43:48.077 回答
1

可能会对代码进行一些问题和一些优化。

1 -@task您在 random_task 中设置的实例变量未传递给 show_random_task 操作。重定向通过整个响应堆栈,其中包括一个空的实例变量集。

2 - 将您的 random_task 更改为:

def random_task
  @task = Task.find(rand(Task.first.id..Task.last.id)) rescue "Item couldn't been randomized!"
end

并将 show_rand_task.html.erb 重命名为 random_task.html.erb

如果您想要实现的只是渲染它,那么重定向 show_random_task 是没有意义的。默认情况下,Rails 将在 random_task 操作结束时呈现 random_task.html.erb。

于 2012-09-10T21:48:36.777 回答