1

Я создал один has_many через отношения в rails api. Я также использовал вложенные маршруты.Вложенные маршруты и операции CRUD с дополнительными значениями для обмана в Rails

Мои модели, как показано ниже;

class Author < ActiveRecord::Base 
has_many :comments 
has_many :posts, :through => :comments 
end 

class Post < ActiveRecord::Base 
has_many :comments 
has_many :authors, :through => :comments 
end 

class Comment < ActiveRecord::Base 
belongs_to :author 
belongs_to :post 
end 

мои маршруты, как показано ниже;

Rails.application.routes.draw do 
namespace :api, defaults: { :format => 'json' } do 
    resources :posts do 
    resources :comments 
    end 
    resources :authors 
end 
end 

Так вот мои цели являются

  1. Комментарии вложенными маршрут таким образом, что я могу создавать и отображать комментарии от пост
  2. Здесь нет какой-либо пост автора. Автор предназначен для владельцев комментариев

Я реализовал концепции и работаю практически со всеми. Но я столкнулся со следующими проблемами: с ассоциациями

  1. Как добавить дополнительные поля для связанной таблицы при создании родительского элемента. Здесь мое требование - когда создается пост, мне нужно вставить одну запись по умолчанию для комментариев. Мой пост реализация контроллера для создания как ниже
def create 
    params = create_params.merge(:record_status => 1) 
    @post = Post.new(params) 
    @post.authors << Author.find(1) 
    if @post.save 
    render :show, status: :created 
    end 
end 

def show 
    @post = Post.find(params[:id]) 
end 

private 
def create_params 
params.permit(:name, :description, :author_id) 
end 

Здесь я передаю AUTHOR_ID в запросе JSON. Это необходимо добавить как идентификатор автора в таблицу комментариев. Теперь я просто жестко закодирован как 1. Я использовал '< <' для входа в ассоциацию. Это работает, но мне также нужно включить еще два поля, которые: комментарии и: record_status. Опять же: комментарии взяты из самого запроса.

Примечание: это не приложение mvc для рельсов. Это rails api и input as json.

  1. Когда я показываю комментарии, используя вложенные маршруты, мне нужно показать автора, а также комментарии из таблицы комментариев. Мой метод контроллера комментариев:
class Api::CommentsController < ApplicationController 
before_filter :fetch_post 

def index 
    @authors = @post.authors.where(:record_status => 1, comments: { record_status: 1 }) 
end 

private 

def fetch_post 
@post = Post.find(params[:post_id]) 
end 

end 

Здесь я получил автор, но не правильные комментарии в соединительной таблице «комментарии»

Пожалуйста, помогите мне решить эти проблемы

ответ

0

Для первой задачи, вы хотите для настройки posts_controller, чтобы принять вложенные атрибуты для комментариев. Добавьте эту строку в начале вашего контроллера:

accepts_nested_attributes_for :comments 

Проверить documentation для получения более подробной информации об этом методе.

Затем вам нужно изменить параметры, что контроллер позволит:

def create_params 
params.permit(:name, :description, :author_id, comments_attributes: [ :author_id, :comments, :record_status ]) 
end 

Измените атрибуты, перечисленные в comments_attributes массиве, чтобы они соответствовали вашей Comment модели.

Я не уверен, что вы пытаетесь получить во второй задаче, но, может быть, вам просто нужно запросить немного по-другому:

@comments = Comment.where(post_id: @post.id).includes(:author) 

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

+0

спасибо. Я решил, что получил. Но небольшое изменение. Я не хочу значение поля record_status в запросе. Вместо этого мне нужно указать значение по умолчанию. Как я объединяю значение record_status связанной таблицы в параметрах. – Akhil

+0

Затем вы можете вынуть его из разрешенных параметров. Пусть клиент отправит значение, а затем сервер проигнорирует его. B/c это не разрешенный параметр. Или удалите свойство до того, как ваш клиент отправит его на сервер. –

+0

Я могу ограничить параметры от клиента. Но мне нужно включить эти параметры в мой контроллер. Я имею в виду, что параметры должны предоставляться внутренне не клиенту. Здесь мне нужно удалить эти параметры из разрешенных параметров и объединить их в контроллер. Но слияние не сработало, пожалуйста, помогите – Akhil