0

当这样的代码运行时,我有一个普遍的问题:

<%= 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控制器的销毁操作。还有其他人可以从上面的表格中推断出什么吗?比如什么将可用或在销毁操作中传递?

4

2 回答 2

1

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

Rails 为模型中包含的字段构建“神奇”查找器方法。如果一个模型有一个lesson_id字段,Rails 会提供一个find_by_lesson_id帮助器。Rails 足够聪明,可以@lesson.id在您将实际的课程对象而不是整数传递给它时进行提取。

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

什么将可用或在销毁操作中传递?

在对收藏关系的销毁路由的后续请求中,控制器唯一可用的是要销毁的对象的 ID。您将能够通过params[:id].

于 2012-04-29T03:08:50.813 回答
1
  1. 销毁操作是通过 AJAX(存在remote: true
  2. 通常,主要逻辑/代码被重构为控制器或辅助方法。

@favorites = current_user.favorite_relationships.find_by_lesson_id(@lesson)IMO 应放置在控制器内部而不是视图中,并且视图应位于@favourites部件中form_for。这就是您对实例变量进行观察的原因

于 2012-04-29T03:11:01.020 回答