\$\begingroup\$
\$\endgroup\$
1
Is there a better way to do this? I'm kinda ending up having a lot of if
statements.
if params[:custom_url] || params[:user_id]
if !params[:user_id].blank?
@user = User.find(params[:user_id]).first
@url = @user.custom_url
else
@url = params[:custom_url]
@user = User.where(:custom_url => @url).first
end
end
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
2 Answers 2
\$\begingroup\$
\$\endgroup\$
I typically chain scopes together like this:
Model:
def self.by_user_and_url(user_id, custom_url)
by_user(user_id).by_custom_url(custom_url)
end
def self.by_user(user_id)
user_id ? where(user_id: user_id) : scoped
end
def self.by_custom_url(custom_url)
custom_url ? where(custom_url: custom_url) : scoped
end
Controller:
if params[:custom_url].present? || params[:user_id].present?
@user = User.by_user_and_url(params[:user_id], params[:custom_url]).first
end
I'm not sure why you had two instance variables. The url can be pulled from the @user instance variable if you need it in your view.
\$\begingroup\$
\$\endgroup\$
2
Not a big fan of case..when
:
@user = User.find_first(params[:user_id]) if params[:user_id]
@user ||= User.find_by_custom_url(@url)
@url = params[:custom_url] || @user.custom_url
Winston Ewert
30.7k4 gold badges52 silver badges79 bronze badges
answered Aug 10, 2012 at 22:49
-
2\$\begingroup\$ At line 2, @url is going to be nil, so there's no sense using it as a param. \$\endgroup\$Pavling– Pavling2012年08月11日 20:32:07 +00:00Commented Aug 11, 2012 at 20:32
-
\$\begingroup\$ Line 1, wouldn't it be better to use
if params[:user_id].present?
\$\endgroup\$deiga– deiga2013年02月11日 19:32:08 +00:00Commented Feb 11, 2013 at 19:32
lang-rb
!params[:user_id].blank?
, you can writeparams[:user_id].present?
which reads more nicely. \$\endgroup\$