我有一个普遍的问题,即当这样的代码运行时会发生什么:
<%= 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
控制器的销毁操作。还有其他人可以从上面的表格推断出来吗?就像在破坏行动中可用或传递的内容一样?
答案 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)
remote: true
) {IM}的@favorites = current_user.favorite_relationships.find_by_lesson_id(@lesson)
应该放在控制器而不是视图中,视图应该@favourites
部分中有form_for
。这就是你对实例变量进行观察的原因