Информация о RoR, необходимая в ways.rb
Мой вопрос - узнать немного больше о ресурсах и маршрутизации. Я последовал учебнику по ruby on rails и начал настраивать свое приложение. В моем приложении я хочу, чтобы пользователь отправлял сообщение, а другие обсуждали эту тему, отправляя фотографии. Я создал пользователей без каких-либо проблем. На главной странице я хочу показать все сообщения пользователей по дате. Модель тем
class Topic < ActiveRecord::Base
attr_accessible :content, :title
belongs_to :user
has_many :posts
validates :title, presence: true, length: { maximum: 140 }
validates :content, presence: true
validates :user_id, presence: true
default_scope order: 'topics.created_at DESC'
end
Модель сообщений:
class Post < ActiveRecord::Base
attr_accessible :content
belongs_to :topic
belongs_to :user
validates :user_id, presence: true
validates :content, presence: true
default_scope order: 'posts.created_at DESC'
end
и миграция это:
create_table "topics", :force => true do |t|
t.string "title"
t.text "content"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "user_id"
end
add_index "topics", ["user_id", "created_at"], :name => "index_topics_on_user_id_and_created_at"
мой themes_controller:
class TopicsController < ApplicationController
before_filter :signed_in_user, only: [:create, :destroy]
before_filter :correct_user, only: :destroy
def show
@topic = Topic.find(params[:id])
@posts = @topic.posts.paginate :page => params[:page], :per_page => 20
end
это мои маршруты.рб:
MyPedia::Application.routes.draw do
resources :users
resources :sessions, only: [:new, :create, :destroy]
resources :topics, only: [:show, :create, :destroy]
resources :posts
root to: 'static_pages#home'
match '/topicin/:id', to: 'topics#show'
мой show.html.erb
<div class ="center">
<h3><%= @topic.title %></h3>
<% if @posts %>
<% for post in @posts do %>
<p><strong><%= post.content %>
<% end %>
</div>
<%end %>
моя таблица маршрутов рейка такова:
topics POST /topics(.:format) topics#create
topic GET /topics/:id(.:format) topics#show
DELETE /topics/:id(.:format) topics#destroy
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
Я могу видеть мои темы на домашней странице в виде списка ссылок без каких-либо проблем. Когда я нажимаю на них, я хочу, чтобы они показывали мне тему и сообщения в ней. когда я использую localhost:3000, это то, что я получаю сейчас.
No route matches {:action=>"show", :controller=>"topics", :id=>#<Topic id: nil, title: nil, content: nil, created_at: nil, updated_at: nil, user_id: 1>}
когда я использую localhost:3000/themes/1
SQLite3::SQLException: no such column: posts.topic_id: SELECT "posts".* FROM "posts" WHERE "posts"."topic_id" = 1 ORDER BY posts.created_at DESC LIMIT 20 OFFSET 0
Поэтому я прочитал инструкцию, но не могу найти способ использовать темы напрямую. Извините за длинный вопрос. Это поможет мне понять многие вопросы о рельсах.
Редактировать 1: я добавил topic_id в таблицу сообщений... контроллер static_pages:
class StaticPagesController < ApplicationController
def home
@topic = current_user.topics.build if signed_in?
@topics = Topic.paginate :page => params[:page], :per_page => 20
end
и ошибка здесь в _topics.html.erb:
<% for topic in @topics do %>
!!!!! <li><%=link_to topic.title, topicin_path(@topic) %></li>
<%= will_paginate @topics %>
<% end %>
2 ответа
Прежде всего, вам нужно проверить link_to
на домашней странице. Похоже вот так link_to
не могу найти тему пользователя.
Вам также нужно topic_id
в posts
потому что у вас есть belongs_to :topic
в вашем Post
модель. Посмотрите на вашу миграцию для posts
создать правильную миграцию и rake db:migrate
,
Наконец, я не думаю, что user
должен иметь темы, у сообщения есть темы, а не пользователь. Вы могли бы тогда вызвать @user.posts.topic
а также topics.first.posts.first.user
,
Удачи.
Кажется, что вы используете вложенные атрибуты, но не используете вложенные ресурсы маршрутов, поэтому пути генерируют значение по теме, а не по темам в сообщении.
Вы можете легко сделать это, используя resource do
метод
resource :posts do
resource :topics
end
или, как сказал Вава Лу, вам нужно передать в значениях отношения
также за вашу ошибкуSQLite3::SQLException: no such column: posts.topic_id: SELECT "posts".* FROM "posts" WHERE "posts"."topic_id" = 1 ORDER BY posts.created_at DESC LIMIT 20 OFFSET 0
Когда вы создаете has_many или любое отношение, вам нужно присвоить значение отношения в БД, чтобы, когда вы находитесь на идентификаторе сообщения 1 и хотите, чтобы он загружал ответы, запрос будет искать ответ, значение post_id которого равно 1., поэтому убедитесь, что вы запустите миграцию, чтобы добавить этот атрибут отношения
Привет,