使用link_to将对象添加到HABTM关系表中

时间:2013-01-16 18:04:58

标签: ruby-on-rails has-and-belongs-to-many link-to

在我的应用程序中,我有List对象和问题对象,列表由问题组成,问题可能属于许多列表。我在两个类上都使用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

现在,在我列表的show视图中,我打算显示所有问题的列表,并提供一个“link_to”将此问题添加到正在显示的当前List中,但我似乎无法弄清楚如何。我是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 %>

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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方法中进行授权/验证/等等。

答案 1 :(得分:0)

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