Home > front end >  how do I use this parameter correctly?
how do I use this parameter correctly?

Time:03-25

I have a method in my rails app.

  def current_user_can_edit?(model)
    user_signed_in? && (
      model.user == current_user ||
      (model.try(:post).present? && model.post.user == current_user)
    )
  end

The method is needed to check the possibility of editing the model. There are posts and events in my app. I would like to dynamically substitute a post or event for a choice, instead of a static post.

How can I write a method correctly so as not to make a lot of conditions? Like, for example, here:



  def current_user_can_edit?(model, action)
    if action.class.to_s == 'Post':
      user_signed_in? && (
        model.user == current_user ||
        (model.try(:post).present? && model.post.user == current_user)
      )
    elsif action.class.to_s == 'Event':
      user_signed_in? && (
        model.user == current_user ||
        (model.try(:event).present? && model.event.user == current_user)
      )
    end
  end

CodePudding user response:

In your method's logic, the expression:

model.try(:post).present? && model.post.user == current_user

can be combined by chaining two try calls:

model.try(:post).try(:user) == current_user

Now you can replace :post by a calculated value:

model.try(action.class.to_s.downcase).try(:user) == current_user

Whole code:

def current_user_can_edit?(model, action)
  user_signed_in? && (
    model.user == current_user ||
    model.try(action.class.to_s.downcase).try(:user) == current_user
  )
end

You could also use some guard clauses:

def current_user_can_edit?(model, action)
  return unless user_signed_in?
  return true if model.user == current_user

  model.try(action.class.to_s.downcase).try(:user) == current_user
end

I'm assuming that action.class.to_s returns "Post". The code would of course be easier if you would pass :post as the method's second parameter.

  • Related