Rails, как связать параметры / получить параметры из других параметров? - PullRequest
0 голосов
/ 26 октября 2018

В этом сценарии есть post_id из комментариев, но я хотел бы получить комментарии в постконтроллере, у которого просто есть идентификатор из ресурса post, поэтому post_id в комментариях и id из post - это один и тот же идентификатор, поэтому я попыталсясвязать оба по

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



  def set_comment_post

    @post = Post.find_by(post_id: set_post)
  end

хорошо, журнал выдает ошибку

, так что, пожалуйста, кто-нибудь пощадит подсказку по этому поводу?

routes log

class PostsController < ApplicationController
  before_action :set_comment_post only: [:comments]


  before_action :set_post, only: [:show, :update, :destroy], except: [:comments]
  before_action :set_user, only: [:show, :update, :destroy, :new]

  # GET /posts
  # GET /posts.json



  def comments

    @comments = @post.comments.order('created_at desc')
    render json: @comments
  end

  # POST /posts
  # POST /posts.json
  def create


    @post = current_user.posts.build(post_params)

    if @post.save

      render json: "Posted successfully", status: 201
    else
      render json: @post.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /posts/1
  # PATCH/PUT /posts/1.json
  def update
    if @post.update(post_params)

      render json: "Posted updated successfully", status: 200
    else
      render json: @post.errors, status: :unprocessable_entity
    end
  end



  private
  def set_user
    @current_user = User.find_by(params[:id])


  end

  # Use callbacks to share common setup or constraints between actions.
  def set_post
    @post = Post.find(params[:id])
  end



  def set_comment_post

    @post = Post.find_by(:post_id => set_post)
  end





  # Never trust parameters from the scary internet, only allow the white list through.
  def post_params
    params.require(:post).permit(:title, :body, :user_id, :posts_count)
  end
end

параметры передаются по запросу

 "/posts/" + this.props.match.params.post_id + "/comments",

1 Ответ

0 голосов
/ 26 октября 2018

Непонятно, зачем вам нужны 2 метода, которые делают одно и то же, но я думаю, что вы хотите

. Используйте before_action, только если вам это нужно для нескольких конечных точек.Кроме того, не используйте оба [:only] и [:except] только одно или другое.Это должно работать:

class PostsController < ApplicationController
  before_action :set_post, only: [:show, :update, :destroy, :comments]
  before_action :set_user, only: [:show, :update, :destroy, :new]

  def comments
    @comments = @post.comments.order('created_at desc')
    render json: @comments
  end

  def create
    @post = current_user.posts.build(post_params)

    if @post.save
      render json: "Posted successfully", status: 201
    else
      render json: @post.errors, status: :unprocessable_entity
    end
  end

  def update
    if @post.update(post_params)
      render json: "Posted updated successfully", status: 200
    else
      render json: @post.errors, status: :unprocessable_entity
    end
  end

  private
  def set_user
    @current_user = User.find_by(params[:id])
  end

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

  def post_params
    # add comments attributes if our text field is called 'text'
    params.require(:post).permit(:title, :body, :user_id, :posts_count, comments_attributes: [ :id, :text ] )
  end
end

Вам также может понадобиться установить accepts_nested_attributes_for

class Post
  accepts_nested_attributes_for :comments, allow_destroy: true

  has_many :comments, dependent: :destroy
end

Тогда, как бы вы ни передавали данные на внешнем интерфейсе, вам нужно пройти форму сообщенияс вложенными полями для комментариев.См https://guides.rubyonrails.org/form_helpers.html#nested-forms

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...