ActiveRecord :: StatementInvalid в Users # show Rails Tutorial Глава 12 - PullRequest
0 голосов
/ 02 апреля 2012

Я получаю кучу неудачных тестов (точнее 21) / сообщение об ошибке на сайте.

Вот сообщение на сайте:

ActiveRecord :: StatementInvalid в пользователях # show
Отображение rails_projects / sample_app / app / views / shared / _stats.html.erb, где поднята строка # 11:

SQLite3 :: SQLException: рядом с «id»: синтаксическая ошибка: SELECT COUNT (*) ОТ «пользователей» INNER JOIN »отношения« ON «пользователи» .id = «отношения» .follower_id WHERE ((«отношения» .followed_ id = 101))

Он также поднял «извлеченный источник (вокруг строки # 11):«

8: </span> </a>
9: </td> <td>
10: <a href="<%= followers_user_path(@user) %>"> <span id="followers" class="stat">
11: <%= pluralize(@user.followers.count, "follower") %> </span>
12: </a> </td>
13:     </tr>
14:   </table>

Trace of template inclusion: app/views/users/show.html.erb

Также:

app/views/shared/_stats.html.erb:11:in `_app_views_shared__stats_html_erb__1272198506242050260_70324836955760_711623751783882131'
app/views/users/show.html.erb:22:in `_app_views_users_show_html_erb___2566196705224179076_70324816563400__997253365199883939'

Когда я забираю

<%= pluralize(@user.followers.count, "follower") %>

, сайт работает (и мои неудачные тесты сокращаются до 6).

Сбой тестов, похоже, схожая ошибка SQL. Вот неудачные тесты:

rspec ./spec/controllers/users_controller_spec.rb:313 # UsersController DELETE 'destroy' as an admin user should destroy the user
rspec ./spec/controllers/users_controller_spec.rb:319 # UsersController DELETE 'destroy' as an admin user should redirect to the users page
rspec ./spec/controllers/users_controller_spec.rb:355 # UsersController follow pages when signed in should show user followers
rspec ./spec/models/user_spec.rb:185 # User micropost associations should destroy associated microposts
rspec ./spec/models/user_spec.rb:265 # User relationships should include the follower in the followers array

Вот ошибки (соответственно), которые они получают:

1. Failure/Error: delete :destroy, :id => @user
 ActiveRecord::StatementInvalid:
   SQLite3::SQLException: near "id": syntax error: SELECT "relationships".* FROM "relationships" WHERE ("relationships".followed_ id = 1)
2. Failure/Error: delete :destroy, :id => @user
 ActiveRecord::StatementInvalid:
   SQLite3::SQLException: near "id": syntax error: SELECT "relationships".* FROM "relationships" WHERE ("relationships".followed_ id = 1)
3. Failure/Error: get :followers, :id => @other_user
 ActiveRecord::StatementInvalid:
   SQLite3::SQLException: near "id": syntax error: SELECT  "users".* FROM "users" INNER JOIN "relationships" ON "users".id = "relationships".follower_id WHERE (("relationships".followed_ id = 2)) LIMIT 30 OFFSET 0
4. Failure/Error: @user.destroy
 ActiveRecord::StatementInvalid:
   SQLite3::SQLException: near "id": syntax error: SELECT "relationships".* FROM "relationships" WHERE ("relationships".followed_ id = 1)
5. Failure/Error: @followed.followers.should include(@user)
 ActiveRecord::StatementInvalid:
   SQLite3::SQLException: near "id": syntax error: SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users".id = "relationships".follower_id WHERE (("relationships".followed_ id = 2))

Вот мой файл "_stats.html.erb":

<% @user ||= current_user %> <div class="stats">
 <table summary="User stats">
 <tr>
    <td>
        <a href="<%= following_user_path(@user) %>">
            <span id="following" class="stat">
            <%= @user.following.count %> following
        </span> 
        </a>
    </td> 
    <td>
        <a href="<%= followers_user_path(@user) %>"> 
            <span id="followers" class="stat">
            <%= pluralize(@user.followers.count, "follower") %>
            </span>
            </a> 
        </td>
    </tr>
</table>

Вот мой файл "show.html.erb":

<table summary="Information about following/followers">
<tr>
    <td class="main">
        <h1><%= @title %></h1>

        <% unless @users.empty? %>
            <ul class="users">
                <%= render @users %>
            </ul>
            <%= will_paginate @users %>
        <% end %>
    </td>
    <td class="sidebar round">
        <strong>Name</strong> <%= @user.name %><br/>
        <strong>URL</strong> <%= link_to user_path(@user), @user %><br/>
        <strong>Microposts</strong> <%= @user.microposts.count%>
        <%= render 'shared/stats' %>
        <% unless @users.empty? %>
            <% @users.each do |user| %>
                <%= link_to gravatar_for(user, :size => 30), user%>
            <% end %>
        <% end %>
    </td>
</tr>

Вот мой файл базы данных отношений (если он помогает):

 class CreateRelationships < ActiveRecord::Migration
  def self.up
create_table :relationships do |t|
  t.integer :follower_id
  t.integer :followed_id

  t.timestamps
end
  add_index :relationships, :follower_id
  add_index :relationships, :followed_id
  add_index :relationships, [:follower_id, :followed_id], :unique => true
end

  def self.down
   drop_table :relationships
 end
end

Я попытался удалить миграцию и начать заново (также подготавливая тестовую базу данных), но все равно ничего.

Если есть какие-либо другие файлы, которые я должен предоставить, чтобы помочь решить проблему, сообщите мне!

EDIT

Проблема здесь заключалась в моей модели пользователя. Вот отредактированная версия (соответствующая часть):

class User < ActiveRecord::Base
 attr_accessor :password
 attr_accessible :name, :email, :password, :password_confirmation

 has_many :microposts, :dependent => :destroy
 has_many :relationships, :foreign_key => "follower_id",
                       :dependent => :destroy
 has_many :following, :through => :relationships, :source => :followed
 has_many :reverse_relationships, :foreign_key => **"followed_id"**,
                               :class_name => "Relationship",
                               :dependent => :destroy
 has_many :followers, :through => :reverse_relationships, :source => :follower

Раньше значение Foreign_key было установлено на «follow_ id»

1 Ответ

2 голосов
/ 02 апреля 2012

Есть дополнительный пробел, который не должен быть между "relationss.followed_" и "id".Ваши взгляды и тесты не имеют к этому никакого отношения, ошибка должна быть найдена в вашей модели отношений или модели пользователя, если вы определите там отношение has_and_belongs_to_many.Если вы не можете определить это сами, опубликуйте соответствующую часть ваших моделей здесь.

...