使用自定义窗体和随机ID渲染随机类实例

时间:2012-09-10 21:19:09

标签: ruby-on-rails-3 forms render

我正在尝试从数据库生成随机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:我是铁杆新手。

2 个答案:

答案 0 :(得分:1)

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

# 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) %>

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

答案 1 :(得分:1)

可能会对代码进行一些问题并且很少进行优化。

1 - 您在random_task中设置的实例变量@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。