我正在尝试构建一个名为
的帮助器def current_project
@current_project = Project.find(params[:project_id])
end
我希望如此,以便在我使用的导航插件中,我可以使用current_project来填充导航。
我遇到的问题是,虽然params [:project_id]在导航配置(navigation.rb)中可用,但它在application_helper.rb中不起作用。我收到以下错误:
“find_with_ids”:无法找到没有ID的项目“
这是导航插件,以防您好奇:http://github.com/andi/simple-navigation/
想法为什么?
由于
答案 0 :(得分:6)
如果将project_id传递给帮助器它不是一个选项,您可以将该方法放入控制器并将其标记为helper_method
。例如:
class ApplicationController < ActionController::Base
helper_method :current_project
private
def current_project
@current_project ||= Project.find(params[:project_id])
end
end
然后在您的观看中,您可以通过以下方式调用它:
<% current_project %>
如你所料。
答案 1 :(得分:4)
而不是
def current_project
@current_project = Project.find(params[:project_id])
end
尝试
def current_project( project_id )
@current_project = Project.find( project_id )
end
调用帮助程序时,将params [:project_id]传递给project_id param值。
答案 2 :(得分:1)
绝对同意rjk,你应该把它放在应用程序控制器中,因为如果你没有你的控制器无法访问该方法。你得到的问题似乎是由于nil id(例如params [:project_id]没有在每个请求中传递),可能只是在项目之间切换的导航动作中传递了?
我不确定简单导航的内部功能是什么,但如果params[:project_id]
仅在导航操作中传递,那么导航操作应该将其存储在会话session[:project_id] = params[:project_id].to_i
中,然后你将使用会话存储的id定义私有控制器方法+帮助程序如下,以便您可以在其他操作中访问它:
class ApplicationController < ActionController::Base
helper_method :current_project
private
def current_project
@current_project ||= Project.find(session[:project_id])
end
end