Home > Blockchain >  Need help validating query parameters
Need help validating query parameters

Time:07-14

I have multiple methods within my controller that takes in query parameters. How can I validate that I am being passed in valid parameters? For example, for the index method, how can I make sure that I am getting an array of authorIds.

def index
  author_ids_array = params[:authorIds].to_s.split(',')

  posts = Post
    .get_posts_by_user_id(author_ids_array)
    .order(sort_column => sort_direction)

  if posts
    render json: { posts: posts }, status: :ok
  else
    render json: {error: posts.errors}, status: :unprocessable_entity
  end
end

Or in this update method. How can I validate that I am getting a valid postId

def update
  post = current_user.posts.find_by(id: params[:id])
  
  if post.update!(post_params)
    post_hash = post.as_json
    post_hash.merge!(authorIds: params[:authorIds])
    render json: {post: post_hash}, status: :ok
  else
    render json: {error: post.errors}, status: :unprocessable_entity
  end
end

Update:

Post Model:

class Post < ApplicationRecord


# Associations
  has_many :user_posts
  has_many :users, through: :user_posts, dependent: :destroy

  # Validations
  validates :text, presence: true, length: { minimum: 3 }
  validates :popularity, inclusion: { in: 0.0..1.0 }

  def tags
    if super
      super.split(",")
    end
  end

  def tags=(value)
    if value.kind_of? Array
      super value.join(",")
    else
      super value
    end
  end

  def self.get_posts_by_user_id(user_id)
    Post.joins(:user_posts).where(user_posts: { user_id: user_id })
  end
end

User Model:

class User < ApplicationRecord
  has_secure_password

  # Associations
  has_many :user_posts
  has_many :posts, through: :user_posts, dependent: :destroy

  # Validations
  validates :username, :password, presence: true
  validates :password, length: { minimum: 6 }
  validates :username, uniqueness: true
end

User_post Model:

class UserPost < ApplicationRecord
 belongs_to :user
 belongs_to :post
end

Feedback parameters expected for update method

CodePudding user response:

You can use specific render like below user this in any method like

def index
  return render body: params.inspect
.
.
end

user below code

return render body: params.inspect

so when you use index it will give you params which is passing

OR you can user below code in your application.html.erb above <%= yield%>

<%= debug(params) if Rails.env.development? %> 

CodePudding user response:

After your clarifications, your question remains unclear to me and it is difficult to guess what you're doing. But I understood that you want to ensure that params[:authorIds] or anything else is an array.

You can see if a given variable is an array the following way:

a = ["1","2"]
if a.is_a?(Array)
  puts "is an array"
end

With params: params[:authorIds].is_a?(Array)

You can use byebug (before Rails 7) or debugger (for Rails 7) to inspect what a param is. As an example:

(ruby@whatever: cluster worker 1: 42779 [MyApp]#42793) params[:ids].class
Array
  • Related