Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interpolated Ruby within a method call?

On my user model, I have a bunch of attributes like is_foos_admin and is_bars_admin that determine which kinds of records a user is allowed to edit.

I'd like to DRY out my edit links, which currently look like this:

<%= link_to 'Edit', edit_foo_path(foo), :class => 'edit' if current_user.is_foos_admin? %>
...
<%= link_to 'Edit', edit_bar_path(bar), :class => 'edit' if current_user.is_bars_admin? %>

I want to make a helper that lets me pass in a foo or bar and get back a link to edit it, like so:

<%= edit_link_for(foo) %>

The helper might look like this (which doesn't work):

def edit_link_for(thing)
  if current_user.is_things_admin?
    link_to 'Edit', edit_polymorphic_path(thing), :class => 'edit'
  end
end

The model-agnostic edit_polymorphic_path method gets me halfway there, but it's the "is_things_admin" method that I don't know how to universalize. If I could use interpolated Ruby inside of a helper, I'd want to do something like

if current_user.is_#{thing.class.name.downcase.pluralize}_admin?

But of course that doesn't work. Any ideas?

like image 981
Steve Grossi Avatar asked Oct 24 '11 20:10

Steve Grossi


People also ask

How do you use interpolation in Ruby?

String Interpolation, it is all about combining strings together, but not by using the + operator. String Interpolation works only when we use double quotes (“”) for the string formation. String Interpolation provides an easy way to process String literals.

What does #{} do in Ruby?

Instead of terminating the string and using the + operator, you enclose the variable with the #{} syntax. This syntax tells Ruby to evaluate the expression and inject it into the string. This is the same program you've already written, but this time we're using string interpolation to create the output.

What is %q in Ruby?

Alternate double quotes The %Q operator (notice the case of Q in %Q ) allows you to create a string literal using double-quoting rules, but without using the double quote as a delimiter. It works much the same as the %q operator.

What is method call in Ruby?

We call (or invoke) the method by typing its name and passing in arguments. You'll notice that there's a (words) after say in the method definition. This is what's called a parameter. Parameters are used when you have data outside of a method definition's scope, but you need access to it within the method definition.


1 Answers

Try using send:

if current_user.send("is_#{@model}_admin?")
like image 172
Alex Peattie Avatar answered Sep 18 '22 22:09

Alex Peattie