0

Taskデータベースからランダムを生成し、ページにレンダリングしようとしています。

メインページには次のものがあります:<%= link_to 'gen task', :action => :random_task %>

コントローラーには、次の2つのメソッドがあります。

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: 私はレールが初めてです。

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 - @taskrandom_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 に答える