Информация о 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., поэтому убедитесь, что вы запустите миграцию, чтобы добавить этот атрибут отношения

Привет,

Другие вопросы по тегам