0

そのため、私は Ruby on Rails には比較的慣れておらず、この言語を使用して大学での独立した研究のためにプロジェクト管理システムを構築しています。これまでに作成したもの:

  • ユーザーが複数のプロジェクトを作成できるエリア (http://i.imgur.com/pXOBg.png)
  • 各プロジェクトで、ユーザーは複数の To Do リストを作成できます ( http://i.imgur.com/FT3no.png )
  • 各 To Do リスト内で、ユーザーは完了/未完了としてマークできる複数のタスクを作成できます (http://i.imgur.com/DMdcN.png)

すべてが SQLite DB の外部キーを介して関連付けられており、タスクを追加する場合を除いて、比較的正常に動作しています。タスクto-do リストに追加されますが、間違った URL にリダイレクトされます。プロジェクト管理システムとは別に To Do リスト アプリを作成し、それを作成する方法とリダイレクト、およびすべてが正常に機能することを確認しましたが、それをプロジェクトに実装するのはやや面倒でした。

発生している問題は次のとおりです: http://i.imgur.com/Axuf2.jpg。URL のリンクはhttp://localhost:3000/projects/2/lists/15である必要があるため、ID が混同されています。表示されているのはhttp://localhost:3000/projects/15/lists/14です。ここで、15 はプロジェクトではなくリストの ID であり、14 はリストではなくタスクの ID です。

問題は、次を含むtasks_controller.rb内にあると思います。

class TasksController < ApplicationController

  attr_accessor :completed
  before_filter :find_list
  respond_to :html, :xml, :js

  def create
    @task = @list.tasks.new(params[:task])
    if @task.save
      flash[:notice] = "Task saved"
      redirect_to project_list_url(@list)
    else
      flash[:error] = "Task could not be saved"
      redirect_to project_list_url(@list)
    end
  end

  def complete
    @task = @list.tasks.find(params[:id])
    @task.completed = true
    @task.save
    redirect_to project_list_url(@list)
  end

  def incomplete 
    @task = @list.tasks.find(params[:id])
    @task.completed = false
    @task.save
    redirect_to project_list_url(@list)
  end

  def destroy
    @task = @list.tasks.find(params[:id])
    if @task.destroy
      flash[:notice] = "Task deleted"
      redirect_to project_list_url
    else
      flash[:error] = "Could not delete task"
      redirect_to project_list_url
    end
  end

  private 

  def find_list
    @list = List.find(params[:list_id])
  end

end

$link redirect_to project_list_url(@list)あるべきだと私は信じているので、以下で問題が発生すると思います$link redirect_to project_list_url(@project, @list)。しかし、私が追加するたびに:

@project = Project.find(params[:project_id])

私のコードでは、to-do タスクは完了から未完了に、またはその逆に移動しません。

これが私のto-doリストビューのコードです:

<h3>Stuff to do</h3>
<ul>
  <% @list.tasks.incomplete.each do |task| %>
    <li><%= task.description %> <%= button_to "Complete", complete_task_path(@list.id,task.id) %></li>
  <% end %>
</ul> 

<h3>Stuff I've Done</h3>
<ul>
  <% @list.tasks.completed.each do |task| %>
    <strike><li><%= task.description %></strike> <%= button_to "Incomplete", incomplete_task_path(@list.id,task.id) %></li>
  <% end %>
</ul> 

<hr />

<%= form_for [@project, @list, @task] do |form| %>
  <p><%= form.text_field :description %> <%= form.submit %></p>

最後に、私のroutes.rbを簡単に見てみましょう:

root :to => 'home#index'

devise_for :users

resources :projects do 
  resources :messages
  resources :lists do
    resources :tasks
  end
end

match 'lists/:list_id/tasks/:id/complete' => 'tasks#complete', :as => :complete_task
match 'lists/:list_id/tasks/:id/incomplete' => 'tasks#incomplete', :as => :incomplete_task

そのため、ID は URL で混同されており、リストを編集するときはいつでもこれを行います (ただし、すべてのタスクで修正できるかどうかはわかりましたが)。

これを見て、私に助けを提供してくれた人に感謝します。あなたのすべての時間を本当に感謝しています。他のコントローラー、モデル、ビュー (プロジェクト、リスト、タスク)、または私のプロジェクトの何かを見る必要がある場合は、喜んで共有します。

4

2 に答える 2

1

project_list_url(@list): このルーティング ヘルパーは、プロジェクトとリストの 2 つのパラメーターを取ります。プロジェクト (またはプロジェクト ID のみ) を追加してみてください。

redirect_to project_list_url(@list.project_id, @list)
于 2012-11-17T20:14:54.637 に答える
0

一見すると、リソースを 3 レベルより深くネストするのは適切ではないと思います。詳細については、このRuby on Rails ガイド を参照してください。しかし、確実にあなたの生活を楽にしてくれるのは、Jose Valim の傑作 inherited_resourcesです。ネストされたリソースに関する多くの問題を解決します。

コントローラーでもう 1 つ重要なことを見逃しているようです: new action です。create action があっても、新しいデータベース レコードは「new」 action に依存します。

def new
 @list = List.find(params[:list_id])
 @task = Task.new
end

def create
 @list = List.find(params[:list_id])
 @task = @list.build(params[:task])
  if @task.save
   # success
  else
   # fail
  end
end

これが、関連付けを作成する基本的なロジックです。

編集済み:「新しい」アクションに間違いがあります。 @task = Task.new の代わりに '@task = @list.tasks.new' にする必要があります。

于 2012-11-17T20:27:12.057 に答える