@weare138

Как сделать user-post-comment ассоциацию?

Хочу попробовать сделать ассоциацию user-post-comment.post-comments работает, с этим разобрался.А вот что бы еще это все было к пользователю привязано, не пойму.Я так понимаю нужно добавить какое то правило в базу данных и исправить экшн в posts контроллере и вьюху.Но не знаю что

class PostsController < ApplicationController
	def index
		@posts = Post.all
	end
	def new
		post = Post.new
	end

	def create
		  post = Post.new(post_params)
		  post.save
		  redirect_to post 
	end

	def update
    post = Post.find(params[:id])
 
    if post.update(post_params)
    redirect_to post
    else
    render 'edit'
    end
    end

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

	def destroy
		post = Post.find(params[:id])
		post.destroy

		redirect_to posts_path
	end

	private
    def post_params
    params.require(:post).permit(:title, :text)
  end
end

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


class Post < ActiveRecord::Base
	belongs_to :user
	has_many :comments
end


class User < ActiveRecord::Base
has_many :posts
has_many :comments
end
  • Вопрос задан
  • 2362 просмотра
Решения вопроса 1
benjaminsmith
@benjaminsmith
Ruby on Rails developer
Если сделаете так с самого начала - все будет работать.

bundle install
rails g scaffold User name

user.rb

class User < ActiveRecord::Base
  has_many :posts
  has_many :comments
end


users_controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  ...

  private
    def set_user
      @user = User.find(params[:id])
    end

    def user_params
      params.require(:user).permit(:name)
    end
end


rake db:migrate

----

rails g scaffold Post title body:text user:references

rake db:migrate

post.rb

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments
end


posts_controller.rb

class PostsController < ApplicationController

  ...


    def post_params
      params.require(:post).permit(:title, :body, :user_id)
    end
end


posts/_form.html.erb

<%= f.hidden_field :user_id, :value => current_user.id %>


<%= post.user.name %> ваш спаситель

-----

rails g scaffold Comment body:text user:references post:references

rake db:migrate

comment.rb

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


comments_controller.rb

class PostsController < ApplicationController

  ...


    def post_params
      params.require(:post).permit(:body, :user_id, :post_id)
    end
end


------
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
difiso
@difiso
В параллельной вселенной я космонавт
А при чем тут контроллер постов? Что-то мне подсказывает, что надо в CommentController::create и CommentController::update добавить нечно похожее на Comment.user = current_user перед сохранением. Хотя могу быть не прав.
Ответ написан
Комментировать
MpaK999
@MpaK999
Буду!
или сразу создавайте из связей, вариантов много
def create
		  post = current_user.posts.create(post_params)
		  redirect_to post 
	end


def create
		  post = current_user.posts << Post.create(post_params)
		  redirect_to post 
	end


def create
              transaction do
                  post = Post.create(post_params)
                  post.user = current_user
                  post.save
              end    
		  redirect_to post 
	end
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы