在application_helper.rb中访问URL参数Project.find(params [:project_id])

时间:2010-10-03 21:22:48

标签: ruby-on-rails ruby-on-rails-3

我正在尝试构建一个名为

的帮助器
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/

想法为什么?

由于

3 个答案:

答案 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