ActionView :: Template :: Error (неопределенный метод `to_model 'для true: TrueClass для метода атрибутов обновления - PullRequest
0 голосов
/ 20 января 2019

Так что это действительно продолжение предыдущей проблемы с кодированием, которую можно найти здесь .В предыдущем вопросе спрашивалось, что не так с серверной частью.Однако теперь у меня возникают проблемы с внешним кодом.

Я пытаюсь создать кнопку, которая при нажатии обновит отношение к избранному и к избранному, если оно уже добавлено.

partials / _favorite.html.erb

<%= form_tag current_user.favorite(@user), remote: true do |f| %>     # partials/_favorite.html.erb:1
    <div>
        <%= hidden_field_tag :followed_id, @user.id %>
    </div>
    <%= button_tag(class: "d-block mx-auto btn btn-warning") do %>
        <%= icon('far', 'star') %>
    <% end %>
<% end %>

forms / _favorite.html.erb

<% unless current_user?(@user) %>
    <div id="follow_form">
        <% if current_user.favorited?(@user) %>
            <%= render 'partials/unfavorite' %>
        <% else %>
            <%= render 'partials/favorite' %>     # forms/_favorite.html.erb:1
        <% end %>
    </div>
<% end %>

_stats.html.erb

<% @user ||= current_user %>

<div class="row">
    <div class="col-4 text-center">
        <%= link_to following_user_path(@user) do %>
            <b>Following</b><br>
            <%= @user.following.count %>
        <% end %>
    </div>
    <div class="col-4 text-center">
        <%= link_to followers_user_path(@user) do %>
            <b>Followers</b><br>
            <%= @user.followers.count %>
        <% end %>
    </div>
    <div class="col-4">
        <%= render 'forms/follow', followed_id: @user.id %>
        <%= render 'forms/favorite', followed_id: @user.id if current_user.following?(@user) %>     # _stats.html.erb:18
    </div>
</div>

Я работал над этим же интерфейсом функции примерно неделю и не смог его успешно реализовать.Любимые и не любимые методы успешно работают благодаря решению в предыдущем вопросе.Комплект тестирования не выявляет ошибок.

Я не понимаю полученную ошибку, которая является основной причиной того, что я не смог решить проблему с кодированием.Буду очень признателен за помощь.

Ошибка, с которой я сталкиваюсь:

ActionView::Template::Error (undefined method `to_model' for true:TrueClass
Did you mean?  to_yaml):
    1: <%= form_tag current_user.favorite(@user), remote: true do |f| %>
    2:  <div>
    3:          <%= hidden_field_tag :followed_id, @user.id %>
    4:  </div>

app/views/partials/_favorite.html.erb:1:in `_app_views_partials__favorite_html_erb__875601414_141134960'
app/views/forms/_favorite.html.erb:6:in `_app_views_forms__favorite_html_erb__719356774_141387060'
app/views/partials/_stats.html.erb:18:in `_app_views_partials__stats_html_erb__832871257_32744880'
app/views/users/show.html.erb:13:in `_app_views_users_show_html_erb__718176203_36043580'

1 Ответ

0 голосов
/ 24 января 2019

Я наконец-то решил проблему с этим атрибутом отношения обновления.

Сначала я должен был определить, что означала полученная ошибка. Для тех, кто еще относительно новичок в Rails, «неопределенный метод to_model для true: TrueClass» означает, что вы пытаетесь создать условный оператор без условного .

Операторы: current_user.favorite (@user) и current_user.unfavorite (@user) возвращали значение true, которое программа не знала, как оценивать. Поэтому мне пришлось изменить:

обертоны / _favorite.html.erb

<%= form_tag current_user.favorite(@user), remote: true do |f| %>
    <div>
        <%= hidden_field_tag :followed_id, @user.id %>
    </div>
    <%= button_tag(class: "d-block mx-auto btn btn-warning") do %>
        <%= icon('far', 'star') %>
    <% end %>
<% end %>

до ...

<%= link_to favorite_relationship_path(current_user.active_relationships.find_by(followed_id: @user.id)), method: :put, remote: true do %>
    <%= button_tag(class: "d-inline btn btn-warning") do %>
        <%= icon('far', 'star') %>
    <% end %>
<% end %>

и аналогично с partials / _unfavorite.html.erb

Это также означало, что мне нужно было ввести последующие действия в контроллере отношений

Relationships_controller.rb

  def favorite
    @user = Relationship.find(params[:id]).followed
    current_user.favorite(@user)
    respond_to do |format|
      # Handle a Successful Unfollow
      format.html
      format.js
    end
  end

  def unfavorite
    @user = Relationship.find(params[:id]).followed
    current_user.unfavorite(@user)
    respond_to do |format|
      # Handle a Successful Unfollow
      format.html
      format.js
    end
  end

Эти действия контроллера будут затем возвращаться к моим методам пользовательской модели:

User.rb

def favorite(other_user)
    active_relationships.find_by(followed_id: other_user.id).favorite
end

def unfavorite(other_user)
    active_relationships.find_by(followed_id: other_user.id).unfavorite
end

, что, в свою очередь, приведет к успешному обновлению атрибутов модели отношений:

Relationship.rb

def favorite
    update_attribute(:favorited, true)
end

def unfavorite
    update_attribute(:favorited, false)
end
...