Ruby on rails 3 使用自定义窗体和随机id呈现随机类实例

Ruby on rails 3 使用自定义窗体和随机id呈现随机类实例,ruby-on-rails-3,forms,render,Ruby On Rails 3,Forms,Render,我试图从数据库中生成一个随机的任务,并将其呈现在页面上 在主页上我有::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'

我试图从数据库中生成一个随机的
任务
,并将其呈现在页面上

在主页上我有:
: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 %>

PS:我是rails新手。

对随机任务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) %>


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

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

1-在随机任务中设置的实例变量
@task
不会传递给show\u random\u任务操作。重定向贯穿整个响应堆栈,其中包括一个空实例变量集

2-将随机_任务更改为:

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

<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_random_任务是没有意义的。默认情况下,Rails将在random_任务操作结束时呈现random_task.html.erb