editar por idioma

This commit is contained in:
f 2018-02-23 16:20:51 -03:00
parent bd3a19de14
commit 98d71596c0
No known key found for this signature in database
GPG key ID: F3FDAB97B5F9F7E7
6 changed files with 48 additions and 20 deletions

View file

@ -22,11 +22,15 @@ class ApplicationController < ActionController::Base
def find_post(site) def find_post(site)
id = params[:post_id] || params[:id] id = params[:post_id] || params[:id]
lang = params.fetch(:lang, I18n.locale.to_s) lang = find_lang
posts = site.posts_for(lang) posts = site.posts_for(lang)
posts.find do |p| posts.find do |p|
p.id == id p.id == id
end end
end end
def find_lang
params.fetch(:lang, I18n.locale.to_s)
end
end end

View file

@ -2,23 +2,26 @@ class PostsController < ApplicationController
before_action :authenticate! before_action :authenticate!
def index def index
@lang = find_lang
@site = find_site @site = find_site
@category = session[:category] = params.dig(:category) @category = session[:category] = params.dig(:category)
@lang = params.fetch(:lang, I18n.locale.to_s)
@posts = @site.posts_for(@lang) @posts = @site.posts_for(@lang)
end end
def show def show
@lang = find_lang
@site = find_site @site = find_site
@post = find_post(@site) @post = find_post(@site)
end end
def new def new
@lang = find_lang
@site = find_site @site = find_site
@post = Post.new(site: @site, front_matter: { date: Time.now }) @post = Post.new(site: @site, front_matter: { date: Time.now })
end end
def create def create
@lang = find_lang
@site = find_site @site = find_site
@post = Post.new(site: @site, front_matter: post_params.to_hash) @post = Post.new(site: @site, front_matter: post_params.to_hash)
@ -30,12 +33,14 @@ class PostsController < ApplicationController
end end
def edit def edit
@lang = find_lang
@site = find_site @site = find_site
@post = find_post(@site) @post = find_post(@site)
end end
def update def update
p = post_params p = post_params
@lang = find_lang
@site = find_site @site = find_site
@post = find_post(@site) @post = find_post(@site)

View file

@ -36,13 +36,20 @@ class Post
class: Jekyll::Document) class: Jekyll::Document)
end end
@lang = lang || I18n.locale.to_s
@site = site @site = site
@post = post @post = post
# los errores tienen que ser un hash para que # los errores tienen que ser un hash para que
# ActiveModel pueda traer los errores normalmente # ActiveModel pueda traer los errores normalmente
@errors = {} @errors = {}
# Si el sitio está traducido, trabajamos con la colección del
# idioma, sino, con posts
if @site.i18n?
@collection = @lang = lang || I18n.locale.to_s
else
@collection = 'posts'
end
# sincronizar los datos del document # sincronizar los datos del document
if new? if new?
@front_matter = {} @front_matter = {}
@ -66,7 +73,7 @@ class Post
# Determina si fue traducido, buscando los slugs de su front_matter # Determina si fue traducido, buscando los slugs de su front_matter
# lang en otras colecciones # lang en otras colecciones
def translated? def translated?
get_front_matter('lang').present? @site.i18n? && get_front_matter('lang').present?
end end
def translations def translations
@ -84,6 +91,7 @@ class Post
# todos los datos para escribir el archivo, que es la condición # todos los datos para escribir el archivo, que es la condición
# necesaria para poder crearlo :P # necesaria para poder crearlo :P
def save def save
binding.pry
cleanup! cleanup!
return false unless valid? return false unless valid?
@ -120,7 +128,11 @@ class Post
# Devuelve la ruta del post, si se cambió alguno de los datos, # Devuelve la ruta del post, si se cambió alguno de los datos,
# generamos una ruta nueva para tener siempre la ruta actualizada. # generamos una ruta nueva para tener siempre la ruta actualizada.
def path def path
basename_changed? ? File.join(@site.path, '_posts', basename_from_front_matter) : @post.try(:path) if basename_changed?
File.join(@site.path, "_#{@collection}", basename_from_front_matter)
else
@post.try(:path)
end
end end
# TODO los slugs se pueden repetir, el identificador real sería # TODO los slugs se pueden repetir, el identificador real sería
@ -174,7 +186,7 @@ class Post
# Genera un post nuevo y lo agrega a la colección del sitio. # Genera un post nuevo y lo agrega a la colección del sitio.
def new_post def new_post
opts = { site: @site.jekyll, collection: @site.jekyll.posts } opts = { site: @site.jekyll, collection: @site.jekyll.collections[@collection] }
@post = Jekyll::Document.new(path, opts) @post = Jekyll::Document.new(path, opts)
end end
@ -182,11 +194,13 @@ class Post
# #
# TODO no sería la forma correcta de hacerlo en Rails # TODO no sería la forma correcta de hacerlo en Rails
def add_post_to_site! def add_post_to_site!
@site.jekyll.posts.docs << @post @site.jekyll.collections[@collection].docs << @post
@site.jekyll.posts.docs.sort! @site.jekyll.collections[@collection].docs.sort!
@site.posts << self unless @site.posts.include? self unless @site.collections[@collection].include? self
@site.posts.sort! @site.collections[@collection] << self
@site.collections[@collection].sort!
end
end end
# Los define, asegurandose que las llaves siempre son strings, para no # Los define, asegurandose que las llaves siempre son strings, para no
@ -210,7 +224,7 @@ class Post
# Reemplaza el post en el sitio por uno nuevo # Reemplaza el post en el sitio por uno nuevo
def replace_post! def replace_post!
@old_post = @site.jekyll.posts.docs.delete @post @old_post = @site.jekyll.collections[@lang].docs.delete @post
new_post new_post
end end

View file

@ -2,12 +2,13 @@
# Usuaria # Usuaria
class Site class Site
attr_accessor :jekyll attr_accessor :jekyll, :collections
attr_reader :path attr_reader :path
def initialize(jekyll:, path: nil) def initialize(jekyll:, path: nil)
@jekyll = jekyll @jekyll = jekyll
@path = path || @jekyll.config['source'] @path = path || @jekyll.config['source']
@collections = {}
end end
# Determina si el sitio está en varios idiomas # Determina si el sitio está en varios idiomas
@ -61,6 +62,10 @@ class Site
@jekyll.config @jekyll.config
end end
def collections
@collections
end
# Los posts de este sitio, si el sitio está traducido, trae los posts # Los posts de este sitio, si el sitio está traducido, trae los posts
# del idioma actual, porque _posts va a estar vacío # del idioma actual, porque _posts va a estar vacío
def posts def posts
@ -77,9 +82,8 @@ class Site
def posts_for(collection) def posts_for(collection)
return unless @jekyll.config['collections'].key? collection return unless @jekyll.config['collections'].key? collection
# TODO tal vez no necesitamos esta magia _collection = @collections[collection]
instance = instance_variable_get("@#{collection}") return _collection if _collection
return instance if instance
Rails.logger.info "Procesando #{collection}" Rails.logger.info "Procesando #{collection}"
@ -92,9 +96,9 @@ class Site
# Los convertimos a una clase intermedia capaz de acceder a sus # Los convertimos a una clase intermedia capaz de acceder a sus
# datos y modificarlos # datos y modificarlos
instance_variable_set("@#{collection}", col.map do |post| @collections[collection] = col.map do |post|
Post.new(site: self, post: post, lang: collection) Post.new(site: self, post: post, lang: collection)
end) end
end end
def categories def categories

View file

@ -10,10 +10,10 @@
- field_class = "form-control #{direction}" - field_class = "form-control #{direction}"
-# TODO habilitar form_for -# TODO habilitar form_for
- if @post.new? - if @post.new?
- url = site_posts_path(@site) - url = site_posts_path(@site, lang: @lang)
- method = :post - method = :post
- else - else
- url = site_post_path(@site, @post) - url = site_post_path(@site, @post, lang: @lang)
- method = :patch - method = :patch
= form_tag url, method: method, class: 'form' do = form_tag url, method: method, class: 'form' do
.form-group .form-group

View file

@ -13,7 +13,8 @@
.row .row
.col .col
= link_to t('posts.edit'), edit_site_post_path(@site, @post), = link_to t('posts.edit'),
edit_site_post_path(@site, @post, lang: @lang),
class: 'btn btn-info' class: 'btn btn-info'
.row .row