0

在我的应用程序中,我有列表对象和问题对象,列表由问题组成,问题可以属于许多列表。我在两个类上都使用了 HABTM,并且我已经创建了他们的连接表,如下所示:

class AddTableListsProblems < ActiveRecord::Migration
  def up
    create_table :lists_problems, :id => false do |t|
    t.references :list
    t.references :problem
    t.timestamps
end
  end

  def down
    drop_table :lists_problems
  end
end

现在,在我的列表的显示视图中,我打算显示所有问题的列表并提供一个“link_to”来将此问题添加到当前显示的列表中,但我似乎无法弄清楚如何去做。我是 RoR 的新手,所以解决方案可能很简单,尽管我似乎无法绕过它。

这是我目前拥有的代码。

    <% @problems.each do |problem| %>
      <%= render problem %>
          | <%= link_to "Add to current list", <How do I access the List.problems method to add the problem and create a relation?> %>
    <% end %>

在此先感谢您的帮助。

4

2 回答 2

1

假设你有一个ListController. 您将为其添加一个add_problem操作。

def add_problem
  list    = List.find(params[:id])
  problem = Problem.find(params[:problem_id])

  list.problems << problem # This appends and saves the problem you selected

  redirect_to some_route # change this to whatever route you like
end

您需要为此创建一条新路线。假设您正在使用资源丰富的路线,您可能会有类似的东西

resources :list do
  member do
    put "add-problem/:problem_id", action: :add_problem, as: :add_problem
  end
end

这将生成以下路线

add_problem_list PUT    /list/:id/add-problem/:problem_id(.:format)    list#add_problem

在你看来,你会改变你的link_to

<% @problems.each do |problem| %>
  <%= render problem %>
      | <%= link_to "Add to current list", add_problem_list_path(list: @list, problem_id: problem.id), method: :put %>
<% end %>

注意这只是一个例子;您想在该add_problem方法中进行授权/验证/等...。

于 2013-01-16T18:19:59.173 回答
0

查看rails source 中的示例,您似乎只需要创建一个新的Problem并将其添加到List.problems数组中,然后保存/更新List.

于 2013-01-16T18:15:39.557 回答