我目前正在研究Rails中的一个爱好项目,偶然发现了我认为是Rails中的常见问题。我已经阅读了几个章节和一个Lynda教程,但我没有找到任何关于这个问题的最佳实践。也许在线社区可以帮助我。
在我的application.html.erb中,我添加了以下代码:
<!DOCTYPE html>
<html>
<head>
<title>SioMeny</title>
<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
</head>
<body>
<div id="wrapper">
<header>
<h1>SiO Menysystem</h1>
</header>
<div id="site_menu">
<%= render :partial => "shared/admin_menu" if admin_logged_in? %>
<%= render :partial => "shared/user_menu" if logged_in? %>
<%= render :partial => "shared/site_menu" %>
</div><!-- div#site_menu -->
<div id="main">
<%= render :partial => "shared/flash", :locals => {:flash => flash} unless flash.nil? %>
<%= yield %>
</div>
</div><!-- div#wrapper -->
</body>
</html>
我的问题始于#site_menu和加载不同的部分。我在这里尝试实现的是一个根据用户可能拥有的权限进行扩展的菜单。 logged_in?和admin_logged_in?位于application_controller。
class ApplicationController < ActionController::Base
protect_from_forgery
def login_required
unless logged_in?
flash[:notice] = "Du må være logget inn for å se denne siden"
redirect_to :controller => "user", :action => "login"
end
end
def admin_required
unless admin_logged_in?
flash[:notice] = "Du må være logget inn som administrator for å se denne siden"
redirect_to :controller => "user", :action => "login"
end
end
def logged_in?
if session[:user_id]
return true
end
return false
end
def admin_logged_in?
if logged_in?
user = User.find_by_id[:user_id]
if user.is_admin?
return true
end
end
return false
end
end
此时我收到错误:
ArgumentError in Site#index
Showing /Users/ola/Documents/Coding/SioMeny/app/views/layouts/application.html.erb where line #15 raised:
wrong number of arguments (0 for 1)
Extracted source (around line #15):
12: <h1>SiO Menysystem</h1>
13: </header>
14: <div id="site_menu">
15: <%= render :partial => "shared/admin_menu" if admin_logged_in? %>
16: <%= render :partial => "shared/user_menu" if logged_in? %>
17: <%= render :partial => "shared/site_menu" %>
18: </div><!-- div#site_menu -->
Rails.root: /Users/ola/Documents/Coding/SioMeny
非常欢迎任何帮助!我还试图让两个logged_in函数都设置一个实例变量,在视图中检查它的类型为Boolean,这个工作,但不是所有的时间,因为它们取决于它们的设置时间。我也尝试在帮助器中制作类似的方法并从视图中调用它们,但这也不起作用。
答案 0 :(得分:0)
我认为您的问题是admin_logged_in?
中的这一行user = User.find_by_id[:user_id]
使用find_by_id末尾的括号,不会将符号作为参数传递,它只是直接调用没有参数的find_by_id。并且find_by_id需要一个参数。假设你的params哈希中有一个:user_id,你可以这样做:
user = User.find_by_id(params[:user_id])