Controllers & Routes

Нистратов Артём

anistratov@go-promo.ru

Routes

resources :snippets
rake routes
resource :snippet
root to: 'snippets#index'
namespace :my do
  resources :snippets do
    put :publish, on: :member
  end
end
namespace :my do
  resources :snippets do
    member do
      put :publish
    end
  end
end
namespace :my do
  resources :snippets
end
resources :users
resources :users do
  resources :snippets
end
  resources :snippets,
    only: [:index, :show]
end
get 'about', to: 'home#about'
get 'about' => 'home#about'
post 'feedback/:category', to: 'feedbacks#add'
post 'feedback(/:category)' => 'feedbacks#add'
match 'preview' => 'snippets#show'
match 'preview' => 'snippets#show',
  via: [:get, :post]
match 'preview' => 'snippets#show',
  via: [:get, :post],
  as: :snippet_preview

Controllers

class SnippetsController < ApplicationController
end
app/controllers/snippets_controller.rb
class SnippetsController < ApplicationController
  def index
    @snippets = Snippet.order(:created_at).last(10)
  end
end
gem 'will_paginate'
class Snippet < ActiveRecord::Base

  enum visibility: [ :_public, :_private ]
  ...
end
rails g migration add_visibility_to_snippet visibility:integer
  scope :with_public_access, -> {
    where visibility: visibilities[:_public]
  }
  
  ...
end
  scope :for_main,  -> { with_public_access.order :created_at }

  ...
end

Controllers

app/controllers/snippets_controller.rb
class SnippetsController < ApplicationController
  def index
    @snippets = Snippet.order(:created_at).last(10)
  end
end
class SnippetsController < ApplicationController
  def index
    @snippets = Snippet.for_main.page params[:page]
  end
end
  def publish
    Snippet.find(params[:id])._public!
  end
end

4.0

  • before_action
  • around_action
  • after_action

3.2

  • before_filter
  • around_filter
  • after_filter
class SnippetsController < ::SnippetsController
  before_action :find_user

  ...
end
class SnippetsController < ::SnippetsController
  before_action :find_user

  ...

  private

  def find_user
    @user = User.find params[:user_id] if params.key? :user_id
  end
end
class SnippetsController < ::SnippetsController
  before_action :find_user

  ...

  private

  def find_user
    @user = User.find params[:user_id] if params.key? :user_id
  end

  def snippets
    if @user.nil?
      Snippet
    else
      @user.snippets
    end
  end
end
class SnippetsController < ApplicationController
  before_action :find_user

  def index
    @snippets = snippets.for_main.page params[:page]
  end

  def publish
    snippets.find(params[:id])._public!
  end

  private

  def find_user
    @user = User.find params[:user_id] if params.key? :user_id
  end

  def snippets
    if @user.nil?
      Snippet
    else
      @user.snippets
    end
  end
end
app/controllers/my/snippets_controller.rb
module My
  class SnippetsController < ::SnippetsController
    private def find_user
      @user = ... # current user
    end
  end
end
module My
  class SnippetsController < ::SnippetsController

    def create
      @user.snippets.create snippet_params
    end

    private def find_user
      @user = ... # current user
    end
  end
end
class SnippetsController
  ...
    
  private
    
  def snippet_params

  end

  ...
end
class SnippetsController
  ...
    
  private
    
  def snippet_params
    params.require(:snippet)
  end

  ...
end
class SnippetsController
  ...
    
  private
    
  def snippet_params
    params.require(:snippet).permit(
     :title, :content, :visibility, :lang_ids
    )
  end

  ...
end
def new
  @snippet = Snippet.new
end

def create
  @snippet = @user.snippets.create snippet_params
end

def edit
  @snippet = @user.snippets.find params[:id]
end

def update
  @snippet = @user.snippets.find(params[:id])
    .update snippet_params
end

def destroy
  @user.snippets.destroy params[:id]
end

<action>.<format>.<template>

def show
  ...
end
  • show.html.erb
  • show.html.haml
  • show.json.erb
  • show.xml.erb
  • ...
def show
  render 'template_name'
end
def show
  render template: 'template_name'
end
def show
  render action: 'action'
end
def show
  redirect_to :root
end
def show
  redirect_to user_snippet_path(
    @snippet.user, @snippet
  )
end
def show
  respond_to do |format|
    format.html { render :snippet }
    format.json { render json: @snippet }
    format.xml  { render xml: @snippet }
  end
end
def show
  if request.user_agent =~ /iPad/
    request.variant = :ipad
  end

  respond_to do |format|
    format.html do |variant|
      variant.phone
      variant.ipad { render layout: :ipad }
      variant.none
    end
    format.json { render json: @snippet }
  end
end
def show
  if request.user_agent =~ /iPad/
    request.variant = :ipad
  end

  respond_to do |format|
    format.html do |variant|
      variant.phone   # => show.html+phone.erb
      variant.ipad { render layout: :ipad }
      variant.none
    end
    format.json { render json: @snippet }
  end
end
def show
  if request.user_agent =~ /iPad/
    request.variant = :ipad
  end

  respond_to do |format|
    format.html do |variant|
      variant.phone   # => show.html+phone.erb
      variant.any(:ipad, :tablet) do
        render layout: :tablet
      end
      variant.none
    end
    format.json { render json: @snippet }
  end
end
session[:coupon_code]
session[:coupon_code] = SecureRandom.hex
session[:coupon_code] = nil
cookies[:color] = '#fff'
cookies.delete :color
flash[:notice] = 'Success!'
Made with Slides.com