如何使用多个控制器方法创建侧栏?

时间:2015-02-26 23:00:39

标签: ruby-on-rails ruby methods controller sidebar

我有多个控制器,我想把他们的一些方法拉进我的侧边栏:

habits_controller
goals_controller
valuations_controller
quantifieds_controller
users_controller

如何在不收到未定义的方法错误的情况下执行此操作?

我尝试创建一个sidebar_controller,但我应该在其中包含哪些内容才能使其正常工作?

让我们以习惯为例,然后我可以将自己学到的经验应用到其他控制器上。

摘自 _sidebar.html.erb



<div id="sidebarheadingtop" class="panel-heading"><h5><b>Today</b></h5></div>
	<% @habits.each do |habit| %>
	      <td><%= raw habit.tag_list.map { |t| link_to t.titleize, tag_path(t) }.join(', ') %></td>
  <% end %>
</div>
&#13;
&#13;
&#13;

habits_controller

&#13;
&#13;
class HabitsController < ApplicationController
  before_action :set_habit, only: [:show, :edit, :update, :destroy]
  before_action :logged_in_user, only: [:create, :destroy]

  def index
    if params[:tag]
      @habits = Habit.tagged_with(params[:tag])
    else
      @habits = Habit.all.order("date_started DESC")
      @habits = current_user.habits
    end
  end

  def show
  end

  def new
    @habit = current_user.habits.build
  end

  def edit
  end

  def create
    @habit = current_user.habits.build(habit_params)
    if  @habit.save
        redirect_to @habit, notice: 'Habit was successfully created.'
    else
        @feed_items = []
        render 'pages/home'
    end
  end

  def update
    if @habit.update(habit_params)
      redirect_to @habit, notice: 'Habit was successfully updated.'
    else
      render action: 'edit'
    end
  end

  def destroy
    @habit.destroy
    redirect_to habits_url
  end

  private
    def set_habit
      @habit = Habit.find(params[:id])
    end

    def correct_user
      @habit = current_user.habits.find_by(id: params[:id])
      redirect_to habits_path, notice: "Not authorized to edit this habit" if @habit.nil?
    end

    def habit_params
      params.require(:habit).permit(:missed, :left, :level, :date_started, :trigger, :target, :positive, :negative, :tag_list, :committed => [])
    end
end
&#13;
&#13;
&#13;

sidebar_controller

&#13;
&#13;
class SidebarController < ApplicationController
  def index
    @habits = current_user.habits
  end
end
&#13;
&#13;
&#13;

我还是初学者,所以任何帮助都会非常感激。谢谢=]

Github https://github.com/RallyWithGalli/ruletoday

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题:您希望从各种控制器中获取方法,然后在侧边栏控制器中调用这些方法。

在我看来这是违反惯例,听起来有点奇怪。如果您希望使应用程序 restful ,则不应从另一个控制器调用控制器的方法。

如果您希望跨多个控制器混合方法(编写一次方法,然后将该方法混合到一堆控制器中,以便所有这些控制器都有自己的方法副本),那么采用该共享方法并将其置于关注中,然后将include置于您的控制器中。在您的情况下:include该模块进入侧边栏控制器。

<强> app/controllers/concerns/shared.rb

module Shared
    def someMethod
        @someVariableToPassToView = 33
    end
end

<强> app/controllers/sidebar_controller.rb

include Shared
# Your shared controller has now mixed in all the methods from within the 
# Shared module ( in this case, the someMethod method)

当然不要忘记创建相应的视图以匹配侧边栏的混合方法:someMethod

<强> 应用程序/视图/侧边栏/ someMethod.html.erb

<p> Outputting the contents of the variable someVariableToPassToView </p>
<p><%= @someVariableToPassToView<%></p>

另外,不要忘记更新 routes.rb 文件,以便将正在混合的操作更新到侧边栏中,以便Rails知道如何访问相应的视图文件:

get 'sidebar/somemethod'

回答您的问题:当我们想要从视图可用的控制器创建变量时,我们将其作为实例变量传递。这就是@的用途,使这个变量成为一个实例变量,这样我们就可以使用<%= %>表示法从视图中提取其内容。这就是我上面作为例子从存储的变量中提取数字33:@someVariableToPassToView

我强烈推荐以下内容:

观看Kevin Skoglund的“Ruby On Rails 4基本训练”。它大约13个小时,是我在网上找到的最好的导轨介绍。位于:http://www.lynda.com/Ruby-Rails-tutorials/Ruby-Rails-4-Essential-Training/139989-2.html

如果你像我一样,你将结束三次观看培训,然后多次回顾培训视频的各个部分。在您熟悉之后,请前往www.codeschool.com观看他们的课程:“Rails 4:Zombie Outlaws”和“Rails 4 Patterns。”

当然,在进入rails之前,您需要确保对ruby编程语言有充分的了解。一旦你把它放到上下文中,Rails就会做得更多:Rails只是ruby代码。 Kevin Skoglund有一篇关于Ruby的优秀培训视频:http://www.lynda.com/Ruby-tutorials/essential-training/47905-2.html

祝你好运!