The Role of Ruby in Modern Web Development

Introduction to Ruby and Web Development

Ruby, a dynamic, open-source programming language with a focus on simplicity and productivity, has been a significant player in the web development realm since its public release in 1995. Created by Yukihiro “Matz” Matsumoto in Japan, Ruby takes a human-centered design approach, prioritizing developer satisfaction and minimizing the complexity of the coding process.

One of the pivotal points in Ruby’s history came with the release of Ruby on Rails (Rails) in 2005, a server-side web application framework that further streamlined web development. Rails adopts the Model-View-Controller (MVC) architecture, facilitating the development of web applications with less code and a convention over configuration philosophy.

Key Features of Ruby include:

  • Elegant Syntax: Ruby’s syntax is readable and expressive, allowing for high-level abstractions that are close to human language, which leads to easier coding and maintenance.
  • Dynamic and Object-Oriented: Everything in Ruby is an object, providing great flexibility. Its dynamic nature allows for metaprogramming, which can result in more compact and reusable code.
  • Vibrant Community: Ruby boasts a community that is welcoming and mature. A wealth of gems (libraries) are available to extend the functionality of core Ruby applications.
  • Integrated Testing: Ruby, especially when used with Rails, encourages test-driven development with integrated testing frameworks that help maintain high-quality code.

In modern web development, Ruby, though facing competition from newer technologies, still holds a significant place. It’s particularly praised for Rapid Application Development (RAD), as it allows developers to quickly make changes owing to its agile nature. Ruby continues to be the backbone of many high-profile web applications, evidencing its ongoing relevance and utility in the creation of internet platforms.

Setting Up the Ruby Development Environment

Before one can begin leveraging Ruby for web development, an appropriate development environment must be established. This involves the installation of Ruby itself, an appropriate editor or integrated development environment (IDE), and various supporting tools and libraries.

Firstly, Ruby must be installed on the developer’s system. This can be done directly from the official Ruby website or through version management tools such as RVM (Ruby Version Manager) or rbenv. Version managers are highly recommended, as they allow developers to easily switch between different Ruby versions as needed for various projects.

After the installation of Ruby, the next step is to set up the development environment:

  • Choosing an IDE or Editor: Popular choices include Visual Studio CodeRubyMine, and Sublime Text. These tools offer Ruby syntax highlighting, code completion, and other features beneficial for efficient coding.
  • Gem Management: Gems are Ruby libraries or programs you can install. Bundler is essential for managing Ruby gems. It ensures that the gems you need are present in development, staging, and production.
  • Frameworks and Libraries: For web development, frameworks like Ruby on Rails simplify the process with built-in tools and components. Install Rails or another preferred Ruby web framework following their documentation.
  • Version Control: A system like Git should be installed and set up for source code management.
  • Local Development Server: Developers often use tools like Puma or WEBrick, included by default in many Ruby and Rails installations.
  • Databases: Install and configure the database system you plan to use, such as PostgreSQLMySQL, or SQLite.

It’s prudent to test the environment after setting it up by running a simple Ruby script or by starting a new Ruby on Rails project to ensure that all components are properly integrated and functioning as expected.

Ruby Basics: Syntax, Variables, and Data Types

Ruby, an elegant and expressive language, allows developers to write clear and succinct code that embodies the principle of “optimizing for programmer happiness.” Its syntax is inspired by several languages, including Perl, Smalltalk, Eiffel, Ada, and Lisp, and it is designed to be simple and intuitive, enabling newcomers to pick it up quickly.

Ruby’s syntax emphasizes convention over configuration, meaning there are preferred ways to write certain operations, which leads to more uniform codebases. Notably, Ruby is a dynamically typed language, which means the type of a variable is determined at runtime, and this allows for more flexible and rapid development.

Variables in Ruby come in different flavors:

  • Local variables: Defined by a lowercase letter or an underscore, their scope is limited to the block, file, method, or class in which they are declared.
  • Instance variables: Prefixed with “@” and are available across methods for any particular instance of a class.
  • Class variables: Prefixed with “@@”, and are shared among all instances of a class.
  • Global variables: Prefixed with “$” and are accessible from anywhere in the Ruby program.

In terms of data types, Ruby offers a rich set of options:

  • Numbers: Including integers and floating-point numbers.
  • Strings: Mutable text sequences, easily manipulated and concatenated.
  • Symbols: Immutable, memory-efficient representations (often used as identifiers).
  • Arrays: Ordered, integer-indexed collections of any object.
  • Hashes: Collection of key-value pairs, similar to ‘dictionaries’ in other languages.
  • Booleans: Representing truefalse, and nil (which also represents “nothing” or “no value”).

Code blocks and iterators in Ruby are fundamental elements, allowing for highly efficient data processing through concise expressions. These, along with Ruby’s object-oriented nature, underscore its elegant approach to common programming tasks, making it distinctly powerful for web development.

Control Structures and Methods in Ruby

Ruby, as a flexible and dynamic programming language, features an assortment of control structures that facilitate fluid and readable code, an asset for web developers seeking simplicity and maintainability.

Ruby’s control structures closely resemble those found in other modern languages, with conditional statements like ifelseelsif, and unless providing the bread and butter for decision-making within code. Additionally, Ruby’s case statement allows for pattern matching, which is particularly valuable when a variable may fall into one of many potential states.

Loops in Ruby are also intuitive, with whileuntilfor, and the idiomatic .each iterator, which is often used for cycling through elements of a collection such as arrays or hashes. The .each method is accompanied by a rich suite of enumerable methods such as .map.select, and .reduce, which enable developers to write concise and expressive code when manipulating data structures.

Ruby is known for its emphasis on “blocks,” anonymous pieces of code that can be passed to methods as arguments. Blocks, combined with the yield keyword, empower developers to create highly customizable methods without an extensive parameter list. This feature is pivotal in Ruby’s internal DSLs (Domain Specific Languages) such as Rake and Bundler, which are integral to modern web development workflows.

Furthermore, Ruby possesses a splat operator *, allowing for methods to accept an arbitrary number of arguments, providing flexibility in how methods are invoked and reducing the need for method overloading.

Ruby’s metaprogramming capabilities are also noteworthy; developers can define methods dynamically with define_method, alter existing methods, or even create classes during runtime. This metaprogramming prowess contributes to Ruby’s role as a foundation for many modern web frameworks, such as Ruby on Rails, which heavily relies on these dynamic features to provide its expressive and efficient syntax.

Within the context of web development, these control structures and methods align seamlessly with the need for writing succinct, readable, and easily maintainable code, reinforcing Ruby’s relevance and utility in modern web development practices.

Exploring Ruby Gems and Frameworks for Web Development

Ruby, as a language, is particularly lauded for its elegant syntax and the vast collection of third-party libraries, known as gems, that extend its capabilities. In the domain of web development, a number of Ruby gems and frameworks have arisen, making the creation of complex, high-quality web applications more efficient and intuitive.

For starters, Ruby on Rails (Rails) stands out as the flagship framework for Ruby web developers. It follows the Model-View-Controller (MVC) architecture, promoting the development of applications that are easy to maintain and extend. Rails advocates convention over configuration, dramatically lowering the number of decisions developers need to make and increasing productivity.

Key Ruby Gems and their Uses include:

  • Sinatra: An alternative to Rails, it’s a domain-specific language for quickly creating web applications in Ruby with minimal effort.
  • Puma: A concurrent HTTP 1.1 server for Ruby/Rack applications, which is designed to run on Ruby implementations such as Rubinius and JRuby as well as standard MRI Ruby.
  • Resque: A Redis-backed library for creating background jobs, placing those jobs on multiple queues, and processing them later.
  • Devise: A flexible authentication solution for Rails based on Warden that streamlines the management of user authentication.
  • Nokogiri: A gem providing HTML, XML, SAX, and Reader parsers with XPath and XSLT support, used for parsing and manipulating data.

Ruby’s ecosystem is further enriched by a variety of other tools and libraries such as RSpec for testing, Capybara for integration testing, and many others that collectively make Ruby a formidable language for web development.

Despite the advent of numerous JavaScript frameworks and the inclination towards full-stack JavaScript development, Ruby’s simplicity, the robustness of its frameworks, and the reliability of its gems, continue to make it a viable and preferable option for many developers when it comes to building web applications.

An Introduction to Rails: Understanding the MVC Framework

Rails, a powerful web application framework written in Ruby, adopts the Model-View-Controller (MVC) architecture, which is paramount in organizing application programming. This structure efficiently separates concerns, allowing developers to maintain and extend applications with ease.

  • Model: Represents the data and the logic of the application. In Rails, ActiveRecord is typically used for database interactions, providing an interface to manipulate the data.
  • View: Creates the user interface. It presents data to the user in a particular format. In Rails, views are usually written using HTML, CSS, and JavaScript, embedded with Ruby code to inject dynamic content.
  • Controller: The middleman between models and views. It processes incoming requests, communicates with models, and directs data to the appropriate view for presentation.

Rails favors convention over configuration, meaning that by following the prescribed conventions, developers can bootstrap applications with minimal setup. This is partly achieved by the range of generators that can create the MVC components for developers, keeping them focused on application-specific logic.

One of the standout features of Rails is its embrace of RESTful architecture, which aligns with CRUD (Create, Read, Update, Delete) actions that are inherently part of the data management within applications. This means that Rails treats website pages as resources that can be created, read, updated, and deleted through standard HTTP requests.

The MVC architecture in Rails allows for improved:

  • Scalability: By keeping the different aspects of the application separate.
  • Maintainability: Codebases are cleaner and more modular.
  • Collaboration: Teams can work on different parts of the application simultaneously without overlap.

Understanding MVC is crucial when delving into Ruby on Rails, as it underlies the organizational structure that makes Rails an efficient and productive tool for web development.

Building Your First Ruby on Rails Application

Engaging in the creation of a Ruby on Rails application is an exciting venture for any developer looking to delve into modern web development. The framework’s convention over configuration philosophy streamlines the process, yet a certain progression should be followed to ensure a solid foundation for your application.

Before initiating the development, one must ensure that Ruby, Rails, and the respective database system are installed on the development machine. Once the environment is set up, the following steps outline the journey of crafting your maiden Rails application:

  1. Start a new Rails project: Utilize the command line to generate a new Rails application. For example:rails new my_first_app This command creates a new directory with all the necessary files and folders structured according to Rails conventions.
  2. Configure the database: Edit the config/database.yml file to set up your database. By default, Rails offers SQLite, but you may opt for other databases like PostgreSQL or MySQL.
  3. Create models and migrate databases: Models represent the data structure. Rails uses a migration system to manage database schema changes. Generating a model with Rails will simultaneously create a migration file that allows you to define your database tables and their columns.
  4. Build routes, controllers, and views: This defines the logic and presentation of your application.
    • Routes are defined in config/routes.rb and determine how HTTP requests are dispatched to controllers.
    • Controllers process incoming requests, interact with models, and render views.
    • Views are the HTML templates that display information to the user.
  5. Test your application: Rails includes a robust testing framework. Writing tests for your models and controllers ensures that your code functions as expected.
  6. Run the Rails server: Executing rails server starts your application on a local server. Visit http://localhost:3000 in your browser to see your app in action.

As you become comfortable with these fundamental steps, you’ll find yourself capable of adding more complex features, integrating with third-party services, and refining the user interface, thus embracing the full potential of Ruby on Rails in modern web development.

Diving Into RESTful Development with Ruby

Ruby, known for its elegant syntax and readable code, is an exceptional language for RESTful development. Representational State Transfer (REST) is a software architectural style that defines a set of constraints to be used for creating Web services. Ruby on Rails, Ruby’s most popular framework, is particularly well-suited for building RESTful applications due to its convention over configuration philosophy and built-in support for RESTful routing.

Essential Concepts for RESTful Development with Ruby

When developing RESTful services with Ruby, there are key concepts and practices that developers typically follow:

  • Resource-Based Architecture: In Ruby on Rails, resources represent entities in your application. Using a resource-oriented approach means designing your app around the business entities, ensuring a clear and logical structure.
  • HTTP Verbs: RESTful services rely on standard HTTP verbs (GETPOSTPUTDELETE) to perform CRUD (Create, Read, Update, Delete) operations on resources. Ruby on Rails maps these operations to controller actions seamlessly.
  • URLs and Routing: Rails offers a sophisticated routing system that maps URLs to controller actions. This system supports RESTful routing out-of-the-box, making it easier to design clean and maintainable URLs.
  • Statelessness: REST demands that the communication between the client and the server is stateless. Ruby on Rails adheres to this by treating each request independently.

Tools and Gems

Ruby’s ecosystem is rich with tools and gems that expedite RESTful development:

  • Rails: The most obvious choice for RESTful API development, offering built-in middleware, routing, and more.
  • ActiveModel Serializers: For creating flexible and customizable JSON structures of Ruby objects.
  • Rack Middleware: Providing components to handle various layers of a web request, including security, session management, and more.
  • Grape: An opinionated micro-framework for creating REST-like APIs in Ruby.

Best Practices

To ensure effective RESTful development, Ruby programmers follow certain best practices:

  • Versioning API: Ensuring the API can evolve without breaking existing clients.
  • Authentication: Implementing token-based authentication for APIs to ensure secure access.
  • Testing: Using RSpec and other testing frameworks to write tests for APIs, making sure they are robust and reliable.

By leveraging the power of Ruby and its frameworks, developers can create RESTful services that are efficient, scalable, and maintainable, cementing Ruby’s role in modern web development.

Database Integration and Active Record Basics

In the arena of web development, Ruby garners acclaim for its elegant syntax and powerful framework, particularly Ruby on Rails. This full-stack framework streamlines database integration through its built-in Object-Relational Mapping (ORM) system known as Active Record. Understanding how Ruby and Active Record facilitate data management is pivotal for modern web developers seeking efficient and robust solutions.

Active Record operates on the “Convention over Configuration” principle, reducing the amount of code a developer needs to write for database interactions. It achieves this magic through several means:

  • Automated Mappings: Active Record automatically maps database tables to Ruby classes and rows to objects. This allows developers to work with a high-level interface for CRUD (Create, Read, Update, Delete) operations.
  • Migrations: Database schema changes are handled with migrations in Ruby on Rails. Developers can alter the database structure using Ruby code, which keeps database schemas version-controlled and the changes easily deployable.
  • Validations and Callbacks: Active Record provides a comprehensive set of validations that ensures data integrity before persistence. Callbacks, on the other hand, hook into the lifecycle of an object, allowing developers to trigger logic before or after an alteration to the database.
  • Associations: It simplifies the definition and handling of relationships between database tables, translating foreign keys and join tables into direct connections between Ruby objects.
  • Query Interface: Active Record supplies a robust query interface that enables developers to write database queries in Ruby, rather than raw SQL, leading to more readable and maintainable code.

The power of Ruby in web development is magnified by Active Record, providing developers a dynamic toolkit to build complex and high-performing web applications. Its ease of use and the ability to handle sophisticated database operations with minimal fuss are reasons why Ruby remains a cherished choice in modern web development.

Front-End Development with Ruby: Integrating HTML, CSS, and JavaScript

While Ruby is commonly identified with back-end development, particularly through the Ruby on Rails framework, it also plays a vital role in front-end development. Ruby can interact with HTML, CSS, and JavaScript to create a seamless web experience. Understanding how Ruby integrates with these technologies enhances one’s grasp of its role in modern web development.

  • HTML Integration: Ruby on Rails employs a template engine called ERB (Embedded Ruby), which allows developers to embed Ruby code within HTML. ERB interprets the Ruby code and replaces it with HTML content on the server-side before sending it to the client. This capability simplifies the generation of dynamic web pages.
  • CSS Management: Ruby can assist in managing CSS through pre-processors like Sass, which extends CSS with features like variables, nested rules, and mixins. These pre-processors are written in Ruby and can be integrated into the Rails asset pipeline, streamlining the styling process and promoting maintainable code.
  • JavaScript Interaction: Ruby on Rails comes with built-in helpers that generate JavaScript code. Through asynchronous XMLHttpRequests (AJAX), Rails can send and retrieve data from the server without requiring a full page refresh. Ruby’s integration with JavaScript frameworks like React or Vue can also be facilitated through Webpacker or the asset pipeline, enabling complex front-end development within a Rails application.

Moreover, Rails provides a convention over configuration approach, which includes default structures for a web page’s front end. This includes a standardized place for scripts, stylesheets, and views, making the development process more efficient and organized.

In sum, front-end development with Ruby is characterized not only by its mature back-end capabilities but also by its versatility in orchestrating the full stack of web technologies to deliver responsive, dynamic user interfaces.

Version Control and Collaboration Best Practices for Developers

In the realm of Ruby web development, as in any software development practice, maintaining an efficient version control system is crucial. This practice ensures that developers can work concurrently on different features without conflict, track changes over time, and revert to previous versions of the codebase if necessary.

  • Consistent Commit Messages: Developers should use clear and descriptive commit messages. This habit makes it easier for teammates to understand the context and intention of each change.
  • Branching Strategy: Adopt a branching strategy like Gitflow or feature branching to organize work effectively. This tactic prevents the main branch from becoming unstable and helps in managing releases.
  • Code Reviews: Before merging branches, code reviews should be mandatory. Reviews improve code quality and foster knowledge sharing among team members.
  • Merge Conflicts: Resolve merge conflicts carefully and promptly. Developers should pull the latest changes from the main branch frequently to minimize conflicts.
  • Automated Testing: Implement continuous integration with automated tests to spot and fix bugs early in the development cycle. Ruby developers often lean on frameworks such as RSpec to automate testing.
  • Documentation: Maintain up-to-date documentation for the codebase. Documentation is not just about inline comments but also about providing clear instructions in README files and wikis.
  • Regular Backups: Automate the process of regular backups for the codebase. This action ensures recovery in case of unexpected data loss.
  • Access Control: Set up proper access control measures to protect sensitive areas of the code. Only trusted developers should have write access to the main branch.
  • Continuous Integration/Continuous Deployment (CI/CD): Utilize CI/CD pipelines to automate building, testing, and deploying applications. This practice helps in identifying integration issues faster and streamlines the deployment process.

These best practices for version control and collaboration are essential for Ruby developers to minimize errors, streamline workflows, and deliver high-quality software efficiently.

Effective Debugging and Testing Strategies in Ruby

Ruby, well-regarded for its elegance and readability, also offers an array of tools and methodologies to facilitate debugging and testing, essential for maintaining high-quality web applications.

  • Interactive Debugging: Ruby comes with an interactive debugger, byebug for Ruby 2.0 and newer, allowing developers to set breakpoints, inspect variable values, and step through code line by line. The pry gem can also be used as a powerful alternative for exploring code in a REPL (Read-Eval-Print Loop) context.
  • Test-Driven Development (TDD): Ruby advocates for TDD, encouraging developers to write tests before code. The minitest and rspec frameworks support this philosophy, providing the necessary structure to write unit and integration tests. Starting with the test ensures that code meets predefined specifications and facilitates refactoring.
  • Behavior-Driven Development (BDD): BDD extends TDD by focusing on the behavior of the application from the user’s perspective. Tools like cucumber allow Rubyists to write high-level acceptance tests in plain language, which are then translated into Ruby code to verify application features.
  • Continuous Integration (CI): Continual testing is made possible with CI tools such as Jenkins, CircleCI, and Travis CI. Ruby projects can benefit from automated testing suites running on every commit, ensuring immediate feedback on potential issues.
  • Benchmarking and Profiling: Ruby’s standard library includes benchmarking and profiling tools like Benchmark and ruby-prof. Developers can identify performance bottlenecks and inefficient code, which is critical in optimizing web applications.
  • Error Reporting Services: Services like Bugsnag and Sentry provide real-time error tracking, which feeds back into the debugging process. These tools help Rubyists track exceptions in live applications and prioritize their fixes according to impact.

By leveraging these strategies and tools, Ruby developers can effectively identify and resolve issues, achieving robust and reliable web applications that stand the test of time.

Performance Optimization for Ruby Web Applications

In the landscape of modern web development, Ruby, particularly its Rails framework, is renowned for its ease of use and developer productivity. However, it is critical to focus on performance optimization to ensure that Ruby web applications can handle high traffic volumes and run efficiently.

Several strategies are vital for optimizing Ruby web applications:

  • Code Profiling: Developers should use tools like rack-mini-profiler or RubyProf to identify bottlenecks in the application code. This step helps in pinpointing inefficient algorithms or database queries that can be optimized or rewritten for better performance.
  • Database Optimization: Database interactions often become performance hurdles as applications scale. Employing efficient indexing, using database views, and implementing caching strategies can drastically reduce query times. Additionally, considering read replicas or sharding may be necessary for high-traffic scenarios.
  • Caching: Implementing caching mechanisms at various levels, such as HTTP caching with tools like Rack::Cache and model caching with Rails.cache.fetch, helps to reduce the need for expensive repeat computations or database queries.
  • Background Jobs: Offloading work to background jobs using libraries like Sidekiq or Resque reduces the response time of web requests by handling tasks like sending emails or data processing asynchronously.
  • Front End Optimization: Minimize the use of heavy libraries and frameworks, compress assets using tools like Webpack or Sprockets, and optimize images to enhance the front-end performance, thus reducing the load time of web pages.
  • Server Optimization: Choose a proper web server that is well-suited for Ruby applications. Puma and Unicorn are popular choices known for their concurrency and forking abilities. Additionally, using a content delivery network (CDN) for static assets can greatly improve response times for users worldwide.

By diligently applying these tactics, developers can ensure that Ruby web applications are not only easy to build but also perform at a level that meets the expectations of modern web users. Each optimization effort contributes towards providing a seamless user experience, maintaining user satisfaction, and improving the overall success of the web application.

Deploying a Ruby on Rails Application

Deploying a Ruby on Rails application involves several key steps to ensure the app is effectively launched on a server where it can be accessed by users. To begin, developers must choose a hosting service that supports Ruby on Rails, such as Heroku, AWS, or DigitalOcean. These platforms often provide straightforward deployment processes tailored for Rails applications.

Here are the typical steps for deployment:

  1. Preparation of the Application:
    • Update the database configuration file (database.yml) to align with the production database.
    • Compile assets using rake assets:precompile.
    • Push the latest code changes to a version control system like Git.
  2. Setting Up the Hosting Environment:
    • Create a new application instance on the chosen hosting service.
    • Configure environment variables such as database credentials and API keys securely.
    • Set up the web server (e.g., Nginx or Apache) if not provided by the platform.
  3. Deployment Process:
    • Deploy the application using the hosting service’s command-line tools or through continuous integration/delivery (CI/CD) pipelines which automate the deployment.
    • Run database migrations in the production environment using rake db:migrate.
  4. Post-Deployment Tasks:
    • Monitor the application’s performance through the service’s dashboard or third-party monitoring tools.
    • Set up error tracking services like Sentry to capture any exceptions in real-time.

It’s essential to consider the security aspects of deployment, including the management of secrets, SSL certificates for HTTPS, and regular updates to the Rails framework and dependencies to patch any vulnerabilities. With Rails’ convention over configuration philosophy, the framework often provides a set of defaults and tasks that simplify the deployment process. However, developers must be well-versed with their chosen deployment strategy to manage and scale their Ruby on Rails applications efficiently.

Continued Learning Resources and Community Engagement

Ruby, though mature, continues to evolve, and for developers seeking to deepen their expertise or remain updated with the latest trends, a wealth of resources is indispensable. Key among these are:

Online Platforms and Courses

  • Codecademy and Udemy offer interactive Ruby courses for all levels.
  • Coursera and edX provide professional courses, including computer science fundamentals using Ruby.
  • RubyMonk and The Odin Project are free resources tailored specifically for Ruby programming.

Books

  • “The Well-Grounded Rubyist” by David A. Black is a must-read for comprehensive Ruby knowledge.
  • “Eloquent Ruby” by Russ Olsen helps in understanding Ruby’s philosophy.
  • “Programming Ruby: The Pragmatic Programmers’ Guide” often referred to as “The Pickaxe Book”, is an authoritative resource.

Community Forums and Groups

  • Ruby on Rails Talk: A mailing list for discussions on Ruby on Rails.
  • Ruby-Forum.com: Provides a platform for Ruby developers to discuss topics and share information.
  • r/ruby: The Ruby subreddit is a place to share news, tips, and questions.

Conferences and Meetups

  • RailsConf: The largest gathering for Rails developers.
  • RubyConf: An annual conference dedicated to Ruby.
  • Meetup.com often lists local and regional Ruby meetups.

Contribution to Open Source

  • Engage with Ruby on Rails on GitHub to contribute to the codebase or help with documentation.
  • Ruby Together sponsors work on Ruby open source projects and is always looking for contributors.

By tapping into these resources and connecting with the community, developers can refine their Ruby skills, stay ahead of technology trends, and contribute to the evolution of Ruby in modern web development. Engaging with the Ruby community through forums, social media, meetups, and conferences offers invaluable opportunities for professional growth and networking.

One Comment

Add a Comment

Your email address will not be published. Required fields are marked *