<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8335567130671209306</id><updated>2011-09-14T11:53:13.535-07:00</updated><title type='text'>Mi Curro</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-873732590133341433</id><published>2011-03-18T13:17:00.000-07:00</published><updated>2011-03-18T13:17:54.943-07:00</updated><title type='text'>Integración con Moneybookers con formulario HTML</title><content type='html'>¿Quieres integrar una pasarela de pagos en tu aplicación rails? ¿Prefieres integrar con moneybookers en lugar de la típica pasarela de paypal? Pues hay dos formas: con un formulario html que describe moneybookers o con una gema para realizar el submit del formulario desde nuestro servidor rails. Ambas soluciones utilizan activemerchant.&lt;br /&gt;&lt;br /&gt;Antes de empezar a tirar código, date de alta en moneybookers como "merchant", es decir, como vendedor. Créate también una cuenta como comprador. Luego les mandas un mail y les dices que hagan que esas cuentas sean de prueba, para que puedas empezar a integrar. Si necesitas pagos recurrentes, también tendrás que mandarles un mail. Si sólo vas a utilizar unos determinados tipos de pago, tendrás que enviarles un mail para que te habiliten el fixed split gateway... En resumen, todo por mail... y un poco lento.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Parece ser que no permiten pagos recurrentes para usuarios que no tengan cuenta de comprador en moneybookers: FAIL.&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Moneybookers describe en su manual y en su página de pruebas, el contenido del formulario que se debe enviar a su servidor. Así mismo, activemerchant tiene un módulo de "integraciones" que permite generar formularios de este tipo para varias pasarelas.&lt;br /&gt;&lt;br /&gt;En cuanto a los parámetros, hay que destacar los siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;return_url_target&lt;/i&gt; y &lt;i&gt;cancel_url_target&lt;/i&gt; permiten pasar el nombre de un iframe para incrustar el formulario de moneybookers en tu aplicación.&lt;/li&gt;&lt;li&gt;Una vez realizado el pago, moneybookers llama a la dirección especificada en &lt;i&gt;notify_url&lt;/i&gt; para que le indiquemos si el pago ha sido validado por nosotros.&lt;/li&gt;&lt;li&gt;&lt;i&gt;hide_login&lt;/i&gt; permite ocultar el formulario de login en moneybookers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Formulario HTML:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;# app/helpers/payment_helper.rb&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;module PaymentsHelper&lt;br /&gt;&amp;nbsp; include ActiveMerchant::Billing::Integrations::ActionViewHelper&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;# app/views/payments/new.html.erb&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;lt;iframe id="mb-iframe" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="mb-iframe" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frameborder="no" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; style="height: 600px; width:500px;" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; scrolling = "auto"&amp;gt;&lt;br /&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;% payment_service_for @payment.transaction_id, "paytoemail@merchant.com",&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :amount =&amp;gt; @payment.amount, &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :currency =&amp;gt; 'EUR', &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :service =&amp;gt; :moneybookers, &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :html =&amp;gt; { :id =&amp;gt; 'mb-form',&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :target =&amp;gt; 'mb-iframe' } do |service| %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;% service.customer :first_name =&amp;gt; @payment.owner.first_name,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :last_name&amp;nbsp; =&amp;gt; @payment.owner.last_name,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :email&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt; @payment.owner.email %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;% service.billing_address :city&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt; @payment.owner.city,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :address1 =&amp;gt; @payment.owner.street1,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :address2 =&amp;gt; @payment.owner.street2,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :zip&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt; @account.owner.postal_code,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :country&amp;nbsp; =&amp;gt; @account.owner.country.code %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;% service.notify_url "http://localhost:3000/payments/notify" %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;% service.return_url url_for(:only_path =&amp;gt; false, :action =&amp;gt; 'done', :merchant_id =&amp;gt; "2200220022") %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;% service.cancel_return_url "http://localhost:3000/payments" %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;%= hidden_field_tag :return_url_target,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "mb-iframe" %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;%= hidden_field_tag :cancel_url_target,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "mb-iframe" %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;%= hidden_field_tag :language,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "ES" %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;%= hidden_field_tag :hide_login,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "1" %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;%= hidden_field_tag :detail1_description,&amp;nbsp;&amp;nbsp; "Bach Complete Collection" %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;%= hidden_field_tag :detail1_text,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "#{@payment.amount} €" %&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;%= submit_tag "Pagar" %&amp;gt; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;% end %&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# app/controllers/payment_controller.rb&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def notify&lt;br /&gt;&amp;nbsp; http_status = 500&lt;br /&gt;&amp;nbsp; notify = ActiveMerchant::Billing::Integrations::Moneybookers::Notification.new(request.raw_post)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; if notify.acknowledge(CONFIG['moneybookers']['secret'])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if notify.complete?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; payment = Payment.find_by_transaction_id(notify.transaction_id)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if notify.posted_amount.to_f == payment.amount.to_f&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; payment.status = notify.status&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; payment.save&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http_status = 200&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logger.error("Failed to verify MoneyBookers's notification parameters, please investigate")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logger.error("Failed to verify MoneyBookers's notification, please investigate")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rescue Exception =&amp;gt; ex&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logger.error(ex.message)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; logger.error("Failed to verify MoneyBookers's notification, please investigate")&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;&lt;br /&gt;&amp;nbsp; render :nothing =&amp;gt; true, :status =&amp;gt; http_status&lt;br /&gt;end&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lo malo de esta opción es que el formulario está visible en el navegador del cliente, y se podría modificar el contenido. La mejor opción es utilizar el parámetro "prepare_only", que permite enviar toda esta información desde el servidor rails, y moneybookers nos contesta con un identificador de sesión en su site, así que ya puedes entrar en &lt;i&gt;https://www.moneybookers.com/app/payment.pl?sid=&amp;lt;id de sesion&amp;gt;&lt;/i&gt; y ahí ya está toda la información necesaria. Así el navegador no tiene ningún tipo de información "sensible". Este método lo describiré en el siguiente post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-873732590133341433?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/873732590133341433/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2011/03/integracion-con-moneybookers-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/873732590133341433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/873732590133341433'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2011/03/integracion-con-moneybookers-con.html' title='Integración con Moneybookers con formulario HTML'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-8317363172997634263</id><published>2010-11-30T06:56:00.000-08:00</published><updated>2010-11-30T06:56:26.052-08:00</updated><title type='text'>Tablas particionadas</title><content type='html'>Si tienes una tabla con varios millones de registros y sabes de antemano que se va a consultar por periodos mensuales, puedes particionar la tabla por años y meses. Así cuando hagas consultas, sólo utilizarás la partición correspondiente y mejorará el rendimiento.&lt;br /&gt;&lt;br /&gt;Al particionar por los valores de un determinado campo, es obligatorio tener dicho campo como parte de la primary key de la tabla.&lt;br /&gt;&lt;br /&gt;A continuación una migración para crear una tabla particionada por meses y años:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;class CreateHistoryAlerts &amp;lt; ActiveRecord::Migration&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; FIRST_YEAR = 2010&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; LAST_YEAR&amp;nbsp; = 2020&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; def self.up&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; create_table :history_alerts do |t|&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.integer :agent_id, &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :references =&amp;gt; nil&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.integer :alert_type_id,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :references =&amp;gt; nil&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.integer :country_id,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :references =&amp;gt; nil&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.string&amp;nbsp; :reason&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt; &lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.boolean :read&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.timestamps&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sql = "ALTER TABLE `history_alerts` drop primary key, add primary key(id, created_at)"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; execute(sql);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sql = "ALTER TABLE `history_alerts` PARTITION BY RANGE (YEAR(created_at)) \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION BY HASH (MONTH(created_at)) \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ("&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for year in (FIRST_YEAR..LAST_YEAR)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sql += "PARTITION p_#{year} VALUES LESS THAN (#{year}) \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SUBPARTITION s_jan_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_feb_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_mar_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_apr_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_may_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_jun_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_jul_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_aug_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_sep_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_oct_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_nov_#{year}, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_dec_#{year}),"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sql += "PARTITION p_all VALUES LESS THAN MAXVALUE \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (SUBPARTITION s_jan_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_feb_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_mar_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_apr_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_may_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_jun_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_jul_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_aug_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_sep_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_oct_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_nov_all, \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBPARTITION s_dec_all))"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; execute(sql);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; end&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; def self.down&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; drop_table :history_alerts&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-8317363172997634263?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/8317363172997634263/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/11/tablas-particionadas.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/8317363172997634263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/8317363172997634263'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/11/tablas-particionadas.html' title='Tablas particionadas'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-310760981181033991</id><published>2010-06-07T23:48:00.000-07:00</published><updated>2010-06-07T23:48:11.150-07:00</updated><title type='text'>Tabs On Rails</title><content type='html'>Ya estaba cansado de ver toda la morralla de código en las vistas para pintar las pestañas, y al final he probado el plugin tabs_on_rails (&lt;a href="http://code.simonecarletti.com/projects/tabsonrails/wiki"&gt;http://code.simonecarletti.com/projects/tabsonrails/wiki&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Mucho más limpio y sencillo. En las vistas solemos tener un partial que pinta las pestañas. Aquí podemos poner algo como:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;lt;% tabs_tag(:builder =&amp;gt; MyTabBuilder) do |tab| %&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;% if logged_in? %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= tab.home I18n.t('tabs.home'), member_dashboard_path %&amp;gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= tab.members I18n.t('tabs.members'),  member_profiles_path %&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;lt;% else %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= tab.home I18n.t('tabs.home'), root_path %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= tab.members I18n.t('tabs.members'), profiles_path %&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Si quieres personalizar la forma de pintar las pestañas, puedes crear tu propio Builder en el directorio lib, por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;class MyTabBuilder &amp;lt; TabsOnRails::Tabs::Builder&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; def tab_for(tab, name, options)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cls = (current_tab?(tab) ? 'selected' : '')&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @context.content_tag(:li) do&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @context.link_to(name, options, :class =&amp;gt; cls)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; end&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora en los controladores, eliges la pestaña que quieres seleccionar, pudiendo incluir lógica o diferenciar por action:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;class ProfilesController &amp;lt; ApplicationController&lt;br /&gt;&amp;nbsp; set_tab :home&lt;br /&gt;&amp;nbsp; set_tab :members, :if =&amp;gt; :my_profile?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; set_tab :posts, :only =&amp;gt; %w(list edit)&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class="ruby CodeRay"&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; private&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&amp;nbsp; def my_profile?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; !params[:id].blank? &amp;amp;&amp;amp; params[:id].to_i == current_user.id&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;&lt;br /&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-310760981181033991?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/310760981181033991/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/06/tabs-on-rails.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/310760981181033991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/310760981181033991'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/06/tabs-on-rails.html' title='Tabs On Rails'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-7679314373215498697</id><published>2010-02-11T09:36:00.000-08:00</published><updated>2010-02-11T09:37:41.999-08:00</updated><title type='text'>merge_conditions</title><content type='html'>Más de una vez hemos tenido que crear una query dinámicamente, en función de los parámetros que recibimos.&lt;br /&gt;&lt;br /&gt;Una opcion es mantener el string de la condicion y una hash con los parametros:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;str_conditions =&amp;gt; "email is not null"&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;h_conditions = {} &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;if !params[:group_ids].blank?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; str_conditions += " and group_id in (?)"&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; h_conditions[:group_ids] = params[:groups_ids] &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;if !params[:manager_id].blank?&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; str_conditions += " and manager_id = ?"&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; h_conditions[:manager_id] = params[:manager_id]&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;User.find :all, :conditions =&amp;gt; [str_conditions, h_conditions]&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Pero se engorrina bastante, con tanto "+=" y con tanto "and" y con tanta hash. &lt;br /&gt;&lt;br /&gt;Otra opcion más clara es tener cada grupo de condiciones separado, y utilizar luego el metodo &lt;i&gt;merge_conditions&lt;/i&gt; de &lt;i&gt;ActiveRecord::Base&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;c1=(params[:group_ids].blank?) ? [] : ["group_id in (?)", params[:groups_ids]]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;c2=(params[:manager_id].blank?) ? [] : ["manager_id = ?", params[:manager_id]]&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;User.find :all, :conditions =&amp;gt; merge_conditions("email is not null", c1, c2)&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-7679314373215498697?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/7679314373215498697/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/02/mergeconditions.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/7679314373215498697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/7679314373215498697'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/02/mergeconditions.html' title='merge_conditions'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-4533196528249756693</id><published>2010-01-26T04:35:00.000-08:00</published><updated>2010-01-26T04:35:26.568-08:00</updated><title type='text'>Configuracion de las aplicaciones</title><content type='html'>Para definir los parámetros configurables de la aplicación, utilizo lo siguiente: un fichero &lt;i&gt;config/config.yml&lt;/i&gt; y un initializer &lt;i&gt;config/initializers/local_config.rb&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;En el &lt;i&gt;config.yml&lt;/i&gt;, mantengo en formato yaml los valores de los parámetros:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;development:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; authentication: "restful"&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; manager:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; activities:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; activate: "Activate"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create: "Create"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;En &lt;i&gt;local_config.rb&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;APP_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/config.yml")[RAILS_ENV]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Así, desde cualquier punto de la aplicación puedo hacer:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;if APP_CONFIG['authentication'] == 'restful'&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;o &lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;lst = APP_CONFIG['manager']['activities']&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;que devolveria una hash con:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;{"create"=&amp;gt;"Create", "activate"=&amp;gt;"Activate"}&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-4533196528249756693?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/4533196528249756693/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/01/configuracion-de-las-aplicaciones.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/4533196528249756693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/4533196528249756693'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/01/configuracion-de-las-aplicaciones.html' title='Configuracion de las aplicaciones'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-3486635574549288687</id><published>2010-01-25T03:54:00.000-08:00</published><updated>2010-01-25T04:25:45.477-08:00</updated><title type='text'>Formularios personalizados</title><content type='html'>Tienes que pintar siempre el mismo tipo de formulario en la aplicacion? Por ejemplo, tienes que pintar siempre una etiqueta al lado del input?&lt;br /&gt;&lt;br /&gt;Tienes un formulario del siguiente estilo:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;% form_for :user do |f| %&amp;gt;&lt;br /&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;label&amp;gt;Login&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= f.text_field :login %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;label&amp;gt;Password&amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= f.password_field :password %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Quedaría más limpio así:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;% form_for :user, :builder=&gt;LabeledFormBuilder do |f| %&amp;gt;&lt;br /&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= f.text_field :login, :label=&gt;"Login" %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= f.password_field :password, :label=&gt;"Password" %&amp;gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Todo lo que tienes que hacer es crearte una clase en &lt;i&gt;app/builders&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;class LabeledFormBuilder &amp;lt; ActionView::Helpers::FormBuilder&lt;br /&gt;&lt;br /&gt;&amp;nbsp; helpers = field_helpers +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %w{date_select datetime_select time_select} +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %w{collection_select select country_select time_zone_select} -&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %w{hidden_field label fields_for} # Don't decorate these&lt;br /&gt;&lt;br /&gt;&amp;nbsp; helpers.each do |name|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; define_method(name) do |field, *args|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; options = args.last.is_a?(Hash) ? args.pop : {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; label = label(field, options[:label], :class =&amp;gt; options[:label_class])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @template.content_tag(:p, label +'&lt;br /&gt;' + super)&amp;nbsp; #wrap with a paragraph &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;&lt;br /&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;y añadir a tu &lt;i&gt;config/environment.rb&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;config.load_paths += %W( #{RAILS_ROOT}/app/builders)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si quieres que por defecto todos tus formularios usen este builder, inicializa en application_helper o en algun initializer:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ActionView&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;::&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Base&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;default_form_builder&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; Labeled&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FormBuilder&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-3486635574549288687?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/3486635574549288687/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/01/formularios-personalizados.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/3486635574549288687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/3486635574549288687'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/01/formularios-personalizados.html' title='Formularios personalizados'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-8872625007451366364</id><published>2010-01-25T00:31:00.000-08:00</published><updated>2010-01-25T00:32:39.589-08:00</updated><title type='text'>Controllers y Presenters</title><content type='html'>Cuando nos queremos dar cuenta, tenemos los controladores llenos de código y empiezan a ser pesados y difíciles de mantener. He visto que hay un patrón de diseño que permite mantener toda esta lógica "sobrante" en otra clase, y dejar en los controladores sólo la funcionalidad de recuperar datos de los modelos y decidir el flujo de la navegación. A este patrón lo llaman Presenter.&lt;br /&gt;&lt;br /&gt;Consiste en crear una clase donde se haga toda la recogida de datos que se hace en los controladores. Por ejemplo, antes tenia un controlador con esta acción:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;def show&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; @profile = Profile.active.find(params[:id])&lt;br /&gt;&amp;nbsp; @friends = @profile.friends.first 12&lt;br /&gt;&amp;nbsp; @recommended_profiles = @profile.recommended(:limit =&amp;gt; 12)&lt;br /&gt;&amp;nbsp; @graffities = @profile.graffities.all(:limit =&amp;gt; 12)&lt;br /&gt;&amp;nbsp; Comment.preload_wall_associations(@graffities)&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; store_location&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; respond_to do |format|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; format.html # show.html.erb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; format.xml { render :xml =&amp;gt; @profile }&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;end &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Los hay peores, pero esto se puede sustituir por:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; def show&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @presenter = ProfilePresenter.new(params)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; store_location&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; respond_to do |format|&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; format.html # index.html.erb&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; format.xml { render :xml =&amp;gt; @presenter }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como se ve, en &lt;i&gt;ProfilePresenter&lt;/i&gt; dejamos toda la lógica de recogida de datos.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;class ProfilePresenter&lt;br /&gt;&lt;br /&gt;&amp;nbsp; def initialize(params)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @presenter_params = params&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; def profile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @profile ||= Profile.active.find(@presenter_params[:id])&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;&lt;br /&gt;&amp;nbsp; def friends&lt;br /&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; end&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; def recommended&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; end&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; def graffities&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Asi, en las vistas, podemos utilizar &lt;i&gt;@presenter.profile&lt;/i&gt; o &lt;i&gt;@presenter.friends,&lt;/i&gt; etc. y dejamos los controladores claros y limpios.&lt;br /&gt;&lt;br /&gt;Estos presenters pueden dejarse en el directorio &lt;i&gt;app/presenters&lt;/i&gt;, por ejemplo. No te olvides de añadir a &lt;i&gt;config/environment.rb&lt;/i&gt; la linea:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;config.load_paths += %W( #{RAILS_ROOT}/app/presenters)&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-8872625007451366364?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/8872625007451366364/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/01/controllers-y-presenters.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/8872625007451366364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/8872625007451366364'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2010/01/controllers-y-presenters.html' title='Controllers y Presenters'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-6165117513752031037</id><published>2009-12-17T08:47:00.000-08:00</published><updated>2009-12-17T08:47:27.998-08:00</updated><title type='text'>HTTPS POST</title><content type='html'>Hace poco he tenido que hacer submit HTTPS contra otra web desde una aplicación Rails, utilizando un el método POST. El código es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; http = Net::HTTP.new("https://www.otraweb.com", 443)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; http.use_ssl = true&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; path = "/login"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # GET request -&amp;gt; so the host can set his cookies&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; resp, data = http.get(path, nil)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cookie = resp.response['set-cookie']&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # POST request -&amp;gt; logging in&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = "#{login=#{@username}&amp;amp;password=#{@password}"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; headers = {&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Cookie' =&amp;gt; cookie,&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; resp, data = http.post(path, data, headers)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;en resp.code tendremos el código HTTP de error, y en data el HTML de la petición resultante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-6165117513752031037?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/6165117513752031037/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/12/https-post.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/6165117513752031037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/6165117513752031037'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/12/https-post.html' title='HTTPS POST'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-8633779609265909586</id><published>2009-08-25T01:14:00.000-07:00</published><updated>2009-08-25T01:21:31.347-07:00</updated><title type='text'>Limitación de tamaño en el plugin Spreadsheet</title><content type='html'>&lt;div style="text-align: justify;"&gt;Exportando datos a excel con el plugin spreadsheet he visto que hay una limitación de tamaño, que impide generar ficheros de más de 7 megas.&lt;br /&gt;&lt;br /&gt;Buscando y rebuscando por ahí, he encontrado un parche que lo soluciona perfectamente. Tendrás que instalar la gema ruby-ole para que funcione:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo gem install ruby-ole&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;y modificar el código del fichero workbook.rb:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;require 'rubygems'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;require 'ole/file_system'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def store_ole_file&lt;br /&gt;#      OLEWriter.open(@file){ |ole|&lt;br /&gt;#         ole.set_size(@biffsize)&lt;br /&gt;#         ole.write_header&lt;br /&gt;#         ole.print(@data)&lt;br /&gt;#         @worksheets.each{ |sheet|&lt;br /&gt;#            ole.print(sheet.data)&lt;br /&gt;#         }&lt;br /&gt;#      }&lt;br /&gt;     Ole::Storage.open @file, 'wb+' do |ole|&lt;br /&gt;        ole.file.open 'Book', 'w' do |f|&lt;br /&gt;           f.write @data&lt;br /&gt;           @worksheets.each { |sheet| f.write sheet.data }&lt;br /&gt;        end&lt;br /&gt;     end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-8633779609265909586?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/8633779609265909586/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/08/limitacion-de-tamano-en-el-plugin.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/8633779609265909586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/8633779609265909586'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/08/limitacion-de-tamano-en-el-plugin.html' title='Limitación de tamaño en el plugin Spreadsheet'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-937395431956220142</id><published>2009-08-05T07:12:00.000-07:00</published><updated>2009-08-05T07:25:17.997-07:00</updated><title type='text'>Autenticación contra Radius</title><content type='html'>&lt;div style="text-align: justify;"&gt;Después de mucho buscar y mucho probar, he conseguido validar contra un servidor Radius de un cliente.&lt;br /&gt;&lt;br /&gt;Partiendo de la libreria &lt;a href="http://rubyforge.org/projects/ruby-radius/"&gt;http://rubyforge.org/projects/ruby-radius/&lt;/a&gt;, y con un tcpdump esnifando paquetes UDP, al final he conseguido validar.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;He tenido que modificar el fichero auth.rb de la libreria:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;-- attr_reader :@packet&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;++ attr_reader :packet&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;y en packet.rb, en el metodo "each":&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;--  @attributes.each_pair {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; --    |key, value|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; --    yield(key, value)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; --  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;++  sorted_attributes = @attributes.keys.sort_by{|item| ++@dict.attr_num(item)}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;++  sorted_attributes.each{|item|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;++     key = item&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;++     value = @attributes[key]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;++&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;++     yield(key, value)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;++  }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;para que se envien ordenados los atributos del paquete Radius.&lt;br /&gt;&lt;br /&gt;Ahora puedes hacer una clase como:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;require 'radius/auth'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class RadiusAuthentication&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  def initialize(hostname, secret)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    @hostname, @secret = hostname, secret&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    @dictionary = File.join(File.dirname(__FILE__), 'dictionary')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  def authenticate(username, password, nasip=nil, timeout=nil)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    nasip = nasip || '127.0.0.1'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    timeout = timeout || 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    rad = Radius::Auth.new(@dictionary, @hostname, nasip, timeout)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    return rad.check_passwd(username, password, @secret)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;y en tu código de aplicación:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; rad = RadiusAuthentication.new(RADIUS_SERVER, RADIUS_SECRET)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; success = rad.authenticate(login, password)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y así validas la password contra el servidor Radius. Utiliza tcpdump para ver los paquetes UDP enviados y recibidos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;tcpdump udp and port 1812 -vvv&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-937395431956220142?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/937395431956220142/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/08/autenticacion-contra-radius.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/937395431956220142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/937395431956220142'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/08/autenticacion-contra-radius.html' title='Autenticación contra Radius'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-2464392075214007385</id><published>2009-07-23T01:04:00.001-07:00</published><updated>2009-07-24T08:05:47.341-07:00</updated><title type='text'>Actualizar a Rails 2.3</title><content type='html'>&lt;div style="text-align: justify;"&gt;He tenido que actualizar algunas aplicaciones de Rails 1.1.6 a la version 2.3.&lt;br /&gt;&lt;br /&gt;La forma más rápida y menos dolorosa, para que funcione todo, aunque no sea una aplicación REST y uses ajax_scaffold, es la siguiente:&lt;br /&gt;&lt;br /&gt;instalar rails 2.3:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;gem install rails -v=2.3.2 --source=http://gems.rubyonrails.org&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;renombrar application.rb por application_controller.rb&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mv application.rb application_controller.rb&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;reemplazar el &lt;span style="font-family: courier new;font-size:85%;" &gt;environment.rb&lt;/span&gt; por uno nuevo de la rails 2.3&lt;br /&gt;reemplazar el &lt;span style="font-family: courier new;font-size:85%;" &gt;boot.rb&lt;/span&gt; por uno nuevo de la rails 2.3&lt;br /&gt;&lt;br /&gt;tendrás que reinstalar algunos plugins, e instalar algunos nuevos como classic_pagination para mantener la paginación original, y render_component:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;ruby script/plugin install git://github.com/masterkain/classic_pagination.git&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;ruby script/plugin install git://github.com/lackac/render_component.git -r rails-edge&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;en las vistas, sustituir todos los:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;%= form_tag ... %&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;  ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;%= end_form_tag %&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;por:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;% form_tag ... do %&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;  ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;% end %&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;lo mismo para los &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;%= form_remote_tag ... %&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sustituir en vistas y controladores las variables &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;@params&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;@flash&lt;/span&gt;&lt;/span&gt; por &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;params&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;flash&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sustituir todas las llamadas a &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Inflector&lt;/span&gt;&lt;/span&gt; por &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;ActiveSupport::Inflector&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;actualizar a la versión nueva de &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;prototype&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;si tenias mensajes de error de activerecord traducidos en &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;config/initializers/active_record_error_messages.rb&lt;/span&gt;&lt;/span&gt;, tendrás que hacer lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rm config/active_record_error_messages.rb&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;vi config/i18n.rb&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;este fichero contiene:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;I18n.load_path += Dir[ File.join(RAILS_ROOT, 'config', 'locales', '*.{yml}') ]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;I18n.default_locale = "es" # default language &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y en &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;config/locales&lt;/span&gt;&lt;/span&gt; crear &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;es.yml&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;"es":&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;  activerecord:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    errors:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;      templates:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;        header:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;          one: "Error: el objeto {{model}} no se ha podido guardar"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;                   other: "{{count}} no se permite guardar {{model}}"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;          body: "Ha habido problemas con los siguientes campos:"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;        messages:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;          accepted: "debe ser aceptado"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;          blank: "no puede estar en blanco"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;          confirmation: "no coincide con la confirmación"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;          ...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-2464392075214007385?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/2464392075214007385/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/07/actualizar-rails-23.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/2464392075214007385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/2464392075214007385'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/07/actualizar-rails-23.html' title='Actualizar a Rails 2.3'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-625164370768660576</id><published>2009-07-22T02:34:00.000-07:00</published><updated>2009-07-22T03:19:03.544-07:00</updated><title type='text'>SQLServer y Ruby</title><content type='html'>Después de probar la conexion ODBC contra SQLServer desde Ubuntu, nos queda conectarnos desde rails. Estoy hablando de rails 2.3.2.&lt;br /&gt;&lt;br /&gt;Tienes que instalar las siguientes gemas (a la derecha pongo la version que he probado):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo gem install activerecord-sqlserver-adapter   (2.2.19)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo gem install dbd-odbc                         (0.2.5)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo gem install dbi                              (0.4.2)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tambien tienes que instalar la libreria odbc de ruby:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;sudo apt-get install libdbd-odbc-ruby&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Creas una conexion en database.yml:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;sqlserver_development:&lt;br /&gt;adapter: sqlserver&lt;br /&gt;mode: odbc&lt;br /&gt;dsn: MISERVIDOR&lt;br /&gt;username: david&lt;br /&gt;password: david&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Creas un modelo en app "mi_prueba.rb" con lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;class MiPrueba &amp;lt; ActiveRecord::Base&lt;br /&gt;establish_connection("sqlserver_development")&lt;br /&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Puedes probar en la consola con:&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt; &lt;span style="font-size:85%;"&gt;MiPrueba.find :first&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-625164370768660576?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/625164370768660576/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/07/sqlserver-y-ruby.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/625164370768660576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/625164370768660576'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/07/sqlserver-y-ruby.html' title='SQLServer y Ruby'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8335567130671209306.post-2958386490254741170</id><published>2009-07-20T03:50:00.000-07:00</published><updated>2009-07-22T02:33:49.467-07:00</updated><title type='text'>SQLServer y Ubuntu</title><content type='html'>&lt;div style="text-align: justify;"&gt;Acabo de conectarme con SQL Server desde Ubuntu.&lt;br /&gt;&lt;br /&gt;Hay que instalar los siguientes paquetes:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;sudo apt-get install unixodbc unixodbc-dev freetds-dev sqsh tdsodbc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Editar el fichero /etc/freetds/freetds.conf y añadir las siguientes lineas:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[MISERVIDOR]&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;    host = 192.168.1.36&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;    port = 2301&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;    tds version = 7.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;el valor de "tds version" varía en función de la versión de sqlserver que se esté usando. En mi caso es un SQLExpress 2005, asi que "tds version" tiene que ser 7.0. Podeis consultar las versiones aqui:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.freetds.org/userguide/choosingtdsprotocol.htm"&gt;http://www.freetds.org/userguide/choosingtdsprotocol.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En el fichero /etc/odbc.ini:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[MISERVIDOR]&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;Driver      = FreeTDS&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;Description = ODBC connection via FreeTDS&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;Servername  = MISERVIDOR&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;Database    = prueba_development&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;Trace       = No&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;UID         = david&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;pwd         = david&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;He tenido problemas porque el SQL Server del que dispongo es una version SQLExpress 2005, que no admite conexiones remotas por defecto. En el panel de control de SQL Server Configuration Manager, hay que habilitar las conexiones remotas.&lt;br /&gt;&lt;br /&gt;Si no se accede por el browser de nombres de SQLServer, tienes que definir un puerto en SQL Server Configuration Manager =&gt; Protocols for SQLExpress =&gt; TCP/IP, en "IP All" =&gt; TCP Dynamic Ports. Ahí he definido el puerto 2301, que es el que aparece en el fichero /etc/freetds/freetds.conf.&lt;br /&gt;&lt;br /&gt;Para probar la conexion basta con ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;sqsh -S MISERVIDOR -U david -P david&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si aparece "&gt;1" es que te has conectado. Ahora puedes ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;use prueba_development&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;go&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;select * from mitabla&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;go&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con la utilidad iodbcadm-gtk, tambien puedes crear el dsn. Primero tienes que definir el driver, diciendole que el fichero del driver es:&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;/usr/lib/odbc/libtdsodbc.so &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;y el fichero de setup es:&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;/usr/lib/libtdsS.so&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Luego defines el dsn con ese driver y pruebas la conexion.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8335567130671209306-2958386490254741170?l=dpgigorro-micurro.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dpgigorro-micurro.blogspot.com/feeds/2958386490254741170/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/07/sqlserver-y-ubuntu.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/2958386490254741170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8335567130671209306/posts/default/2958386490254741170'/><link rel='alternate' type='text/html' href='http://dpgigorro-micurro.blogspot.com/2009/07/sqlserver-y-ubuntu.html' title='SQLServer y Ubuntu'/><author><name>David Perez</name><uri>http://www.blogger.com/profile/15859017740138822680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
