Skip to content

Instantly share code, notes, and snippets.

@ivanxuu
Created November 21, 2017 17:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ivanxuu/3a5c098ea52b0014a09c91b000fce80c to your computer and use it in GitHub Desktop.
Save ivanxuu/3a5c098ea52b0014a09c91b000fce80c to your computer and use it in GitHub Desktop.
Chuleta phoenix

ASSETS

Como añadir una librería de JS a phoenix?

  1. Instala la dependencia con assets/$ npm install --save jquery

  2. El fichero package.json se actualizará

  3. Puede que necesites cambiar el fichero brunch-config.js. Por ejemplo con jQuery si necesitas el $ disponible en todos los sitios

    npm: { enabled: true, globals: { $: 'jquery', jQuery: 'jquery' } }

Si en cambio sólo lo vas a usar en un par de sitios puntuales te puedes apañar con un:

import jQuery from "jquery" // import $ from "jquery"

ECTO

Repo.insert(%User{name: "Ivan"}) #=> {:ok, u} || {:error, u}
Repo.all(User)
Repo.get(User, 1)
Repo.get_by(User, name: "Ivan")

changeset = User.changeset(%User{}, attrs) |> Repo.insert()
changeset = Ecto.Changeset.put_change(changeset, %{name: "Ivan2"})
Ecto.Changeset.get_change(changeset, :name) #=> "Ivan2"

Repo.all(User) |> Repo.preload(:posts)
user = Repo.get(User, 1) |> Repo.preload(:posts)
Repo.one(from u in User, limit: 1, preload: :posts)
Ecto.assoc(user, :posts) |> Repo.all() # Devuelve sólo posts

Add assoc:

Ecto.build_assoc(user, :post) # Crea post con user_id = 1
|> Post.changset(%{title: "My post"})
|> Repo.insert()

Ecto.Changeset.put_change(changeset, :password_hash, "abc2encrypt")

from c in Category, order_by: c.name, select: {c.id, c.name}

CONTROLLER

conn
|> redirect(to: user_path(conn, :show, user))
|> put_flash(:notice, "Hello!") # Or :error

Plug.Conn

assign(conn, :current_user, user) #=> conn
get_session(conn, :user_id) #=> 123
halt(conn) #=> conn.halted => true
put_session(conn, :user_id, 123) #=> conn
delete_session(conn, :user_id) #=> conn
configure_session(conn, drop: true)

PLUGS

NOTA: Plug es un macro que comprueba si la conn se ha detenido con halted == true cuando se llama a halt()

Module plugs

plug MyPlug, opt1: "value1"

defmodule MyPlug do
  import Plug.Conn
  def init(opts), do: opts[:opt1] || "default"
  def call(conn, opts) do
    opts #=> "value1"
    conn # Change the conn as desired
  end
end

Function plugs

plug :auth, opt1: "value1"
defp auth(conn, %{opt1: value}), do: conn

VIEWS

form_for @changeset, user_path(conn, :create), fn(f)->
  label f, :name, "Nombre"
  text_input f, :name, placeholder: "name", class: "cl"
  error_tag f, :name
  password_input f, :password
  select f, :category_id, [{"Art", 1}], prompt: "Category"
  submit "Enviar"
form_for @conn, session_path(conn, :create), [as: :session], fn(f)->

link "log out", to: session_path(conn, :delete, @current_user),
  method: :delete

ECTO.SCHEMA

schema "videos" do
  field :name, :string
end

ECTO.MIGRATION

create table("videos") do # alter table("videos")
  add :user_id, references(:users, on_delete: :nothing)
  # :nothing | :delete_all | :nilify_all
end

CHANNELS

[javascript]
import socket from "./socket"
socket.connect()

let vidChannel = socket.channel("videos"+videoId)
vidChannel.join()
  .receive("ok", resp => console.log("joined", resp))
  .receive("error", reason => console.log("failed", reason))
vidChannel.on("ping", ({count})=>console.log("PING",count))
vidChannel.push("new_annotation", data)
vidChannel.on("new_annotation", (resp)=>{...})

[web/channels/user_socket.ex]
#TODO:

TESTs

$ mix test test/rumbl/my_test.exs:12

defmodule Rumbl.VideoTest do
  use Rumbl.DataCase # o ChannelCase o ConnCase
  describe "comment" do
    alias Rumbl.Videos.Video # Solo para el bloque
    @tag login_as: "max"
    test "success" do
      conn = get conn, "/" # o get conn, video_path(conn, :index)
      assert html_response(conn, 200) =~ "Welcome"
      assert conn.halted
    end
  end
end

JAVASCRIPT ES2016

[player.js]
let Player = {
  player: null,
  init(arg1, arg2){
    let onlyThisScope = 123
    onlyThisScope # Return a value
  },
}
export default Player

[other.js]
import Player from "./player"
Player.init("a","b") #=> 123
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment