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