如何以干燥的方式创建此link_to条件?

时间:2016-12-12 05:43:19

标签: ruby-on-rails ruby-on-rails-5

我想做以下事情:

<% if current_user.has_role? :demo %>   
 <%= link_to profile_path(@selected_profile) do %>    
<% else %>    
  <%= link_to profile_path(profile) do %>    
<% end %>

将其抛弃的是link_to声明中if内的阻止的开头。

那么如何在不必复制此if块中的所有代码两次的情况下实现此目的呢?

修改1

这是我从上面的代码中得到的错误:

SyntaxError at /
syntax error, unexpected keyword_else, expecting keyword_end
'.freeze;         else 
                      ^

4 个答案:

答案 0 :(得分:2)

你可以这样做:

<% chosen_profile = current_user.has_role?(:demo) ? @selected_profile : profile %>
<%= link_to profile_path(chosen_profile) %>

因此,这不会重复您需要执行的link_to标记。由于您必须重定向到同一路径并只更改profile对象,因此这将起作用。如果该行看起来很长且不可读,您可以将三元组更改为if else阻止。

正如大家提到的那样,在do之后不要使用link_to,直到你需要一个块。这样可以解决您的错误。

答案 1 :(得分:0)

您可以通过在user.rb(Model)

中定义方法来实现此目的
  def demo?
    self.has_role?("demo")
  end

然后你在你的观点中写下

<% if current_user.demo? %>   
 <%= link_to profile_path(@selected_profile) %>    
<% else %>    
  <%= link_to profile_path(profile)  %>    
<% end %>

这可能会对你有所帮助。

答案 2 :(得分:0)

do应该有end

  1. 以下是link_to
  2. Ruby Doc参考
  3. 以下是do in Ruby

    的更多信息
    <% if current_user.has_role? :demo %>   
     <%= link_to profile_path(@selected_profile) do %> 
       selected profile
     <% end %>   
    <% else %>    
      <%= link_to profile_path(profile) do %> 
       profile  
      <% end %>  
    <% end %>
    

答案 3 :(得分:0)

由于do您收到错误,您正在打开该块但未关闭它,请尝试此代码

<% if current_user.has_role? :demo %>   
 <%= link_to 'Profile', profile_path(@selected_profile) %>    
<% else %>    
  <%= link_to 'Profile', profile_path(profile) %>    
<% end %>

,您可以在控制器中执行此操作

@selected_profile = current_user.has_role?(:demo) ? @selected_profile : profile

然后在视图中

<%= link_to 'Profile', profile_path(@selected_profile) %>

希望有所帮助!