Forum: Ruby on Rails method conditional option pattern

Posted by Kad Kerforn (kadoudal)
on 2012-11-09 08:29
(Received via mailing list)
When I have this pattern

       sign_me(@user, :event => :authentication, :subdomain => 
subdomain)

how can I write it to avoid sending the :subdomain option if 
subdomain.nil?
  ( if possible ..)

       sign_me(@user, :event => :authentication  #?, :subdomain =>
subdomain unless subdomain.nil?  )
Posted by Jim ruther Nill (jimboker)
on 2012-11-09 09:13
(Received via mailing list)
On Fri, Nov 9, 2012 at 3:27 PM, Erwin <yves_dufour@mac.com> wrote:

> When I have this pattern
>
>        sign_me(@user, :event => :authentication, :subdomain => subdomain)
>
> how can I write it to avoid sending the :subdomain option if
> subdomain.nil?   ( if possible ..)
>
>        sign_me(@user, :event => :authentication  #?, :subdomain =>
> subdomain unless subdomain.nil?  )
>

I'm not sure if it's possible to do it in a single line (as far as you 
want
to have a tidy code)

opts = { event: :authentication }
opts[:subdomain] = subdomain if subdomain

sign_me @user, opts



>
>
>



--
Posted by Kad Kerforn (kadoudal)
on 2012-11-09 10:00
(Received via mailing list)
thanks

Le vendredi 9 novembre 2012 08:27:59 UTC+1, Erwin a crit :
Posted by Colin Law (Guest)
on 2012-11-09 10:27
(Received via mailing list)
On 9 November 2012 07:27, Erwin <yves_dufour@mac.com> wrote:
> When I have this pattern
>
>        sign_me(@user, :event => :authentication, :subdomain => subdomain)
>
> how can I write it to avoid sending the :subdomain option if subdomain.nil?
> ( if possible ..)
>
>        sign_me(@user, :event => :authentication  #?, :subdomain => subdomain
> unless subdomain.nil?  )

You could try
        sign_me(@user, :event => :authentication, (:subdomain =>
subdomain unless subdomain.nil?)  )
or
        sign_me(@user, :event => :authentication, :subdomain =>
(subdomain unless subdomain.nil?)  )

Colin
Posted by Jim ruther Nill (jimboker)
on 2012-11-09 10:39
(Received via mailing list)
On Fri, Nov 9, 2012 at 5:25 PM, Colin Law <clanlaw@googlemail.com> 
wrote:

> subdomain
> > unless subdomain.nil?  )
>
> You could try
>         sign_me(@user, :event => :authentication, (:subdomain =>
> subdomain unless subdomain.nil?)  )
>

I was surprised that you answered this Colin so I tried it out but I got 
a
syntax error

>> app.root_path(foo: 'me', (bar: 'blah' if false))
SyntaxError: (irb):17: syntax error, unexpected tLABEL
app.root_path(foo: 'me', (bar: 'blah' if false))
                              ^
(irb):17: syntax error, unexpected ')', expecting tASSOC
from
/home/jim/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.2/lib/rails/commands/console.rb:47:in
`start'
from
/home/jim/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.2/lib/rails/commands/console.rb:8:in
`start'
from
/home/jim/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.2/lib/rails/commands.rb:41:in
`<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'


> or
>         sign_me(@user, :event => :authentication, :subdomain =>
> (subdomain unless subdomain.nil?)  )
>

and this still passes subdomain as a key if used in a hash but if used 
in a
routes helper, this will work :D

>> app.root_path(foo: 'me', bar: ('blah' if false))
=> "/?foo=me"


> > https://groups.google.com/d/msg/rubyonrails-talk/-....
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>


--
Posted by Colin Law (Guest)
on 2012-11-09 11:15
(Received via mailing list)
On 9 November 2012 09:37, Jim Ruther Nill <jvnill@gmail.com> wrote:
>> >
>> subdomain unless subdomain.nil?)  )
> from
> 
/home/jim/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.2/lib/rails/commands/console.rb:47:in
> `start'
> from
> 
/home/jim/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.2/lib/rails/commands/console.rb:8:in
> `start'
> from
> 
/home/jim/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.2/lib/rails/commands.rb:41:in
> `<top (required)>'
> from script/rails:6:in `require'
> from script/rails:6:in `<main>'

I am not surprised that did not work, my answer was not intended to
convey any suggestion that it would work, just something that would be
interesting to try.

>
>>
>> or
>>         sign_me(@user, :event => :authentication, :subdomain =>
>> (subdomain unless subdomain.nil?)  )
>
>
> and this still passes subdomain as a key if used in a hash but if used in a
> routes helper, this will work :D

Yes, it will pass the subdomain as nil, so it depends on the context
whether this is satisfactory.

Colin
Posted by Tommaso Visconti (Guest)
on 2012-11-09 14:46
(Received via mailing list)
I have a related question.
I was suggesting Erwin to use just:

sign_me(@user, :event => :authentication  #?, :subdomain => subdomain)

because if subdomain is nil, sign_me should correctly handle it.
I mean, in an hypothetical sign_in method I'd write:

def sign_me(user, options)
   if options[:subdomain]
     # do_something
   end
end

if subdomain is nil the method handles it correctly.
but with this code:

def sign_me(user, options)
   if options.has_key? :subdomain
     # do_something
   end
end

this goes wrong ("options.has_key? :subdomain" is true)! So I'd say the
first implementation seems more correct, do you agree with me or I'
missing something important about checking hash parameters?
Posted by Colin Law (Guest)
on 2012-11-09 16:33
(Received via mailing list)
On 9 November 2012 13:44, Tommaso Visconti <tommaso.visconti@gmail.com> 
wrote:
>     # do_something
>   end
> end
>
> if subdomain is nil the method handles it correctly.

That is the way I would do it.

Colin
Posted by Kad Kerforn (kadoudal)
on 2012-11-09 17:20
(Received via mailing list)
Thanks Colin

I finally decided to keep the :subdomain option and let the method 
decide
about what to do with it ( seems to be the common pattern)


Le vendredi 9 novembre 2012 10:26:34 UTC+1, Colin Law a crit :
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.