form_for在rails中构建,有人可以推断出什么?

时间:2012-04-29 03:01:47

标签: ruby-on-rails form-for

我有一个普遍的问题,即当这样的代码运行时会发生什么:

<%= form_for(current_user.favorite_relationships.find_by_lesson_id(@lesson),
             html: {method: :delete},
             remote: true) do |f| %>
             <div><%= f.hidden_field :lesson_id %></div>
  <%= f.submit "Unfavorite", class: "btn btn-large" %>
<% end %>

特别是第一行代码。我通常会看到某种形式的实例变量而不是

current_user.favorite_relationships.find_by_lesson_id

我可以假设这将进入FavoriteRelationship控制器的销毁操作。还有其他人可以从上面的表格推断出来吗?就像在破坏行动中可用或传递的内容一样?

2 个答案:

答案 0 :(得分:1)

据推测,控制器通过变量Lesson向视图提供了@lesson个对象。您当前的用户,User对象,大概是has_many :favorite_relationships,而belongs_to :lesson依次为favorite_relationships,这意味着lesson_id表中有一个名为lesson_id的字段。

Rails为您的模型为其包含的字段构建“魔术”查找器方法。如果模型具有find_by_lesson_id字段,则Rails会提供@lesson.id帮助程序。当你传递一个实际的Lesson对象而不是整数时,Rails足够聪明地提取FavoriteRelationship

最终结果是form_for类型的对象被传递到@favorite_relationship助手。这与在控制器中查找对象并通过(例如)params[:id]变量将其传递给视图没有什么不同。

  

在销毁行动中可以获得或传递的内容是什么?

控制器在对FavoriteRelationship的destroy路由的后续请求中唯一可用的东西是要销毁的对象的id。您可以通过{{1}}访问它。

答案 1 :(得分:1)

  1. 销毁行动是通过AJAX(存在remote: true
  2. 通常,主逻辑/代码被重构为控制器或辅助方法。
  3. {IM}的@favorites = current_user.favorite_relationships.find_by_lesson_id(@lesson)应该放在控制器而不是视图中,视图应该@favourites部分中有form_for。这就是你对实例变量进行观察的原因