我想做以下事情:
<% 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
^
答案 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
。
以下是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) %>
希望有所帮助!