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