4

我正在编写一个带有名为“pages_controller”的控制器的 Ruby on Rails 应用程序,该控制器负责向用户显示页面。可以显示 3 种不同类型的页面,每种情况下后端必须发生不同的事情,所以我决定将功能分解为控制器中的 3 个方法。当用户请求一个页面时,调用“show”方法,判断该页面是否: 1. 属于该用户 2. 属于另一个用户,并且可以被请求它的用户查看 3. 属于另一个用户,并且不能被请求它的用户查看(未经授权)

然后从那里调用适当的方法来显示页面。代码看起来像这样:

def show
    if (something)
      showMine

    elsif (something else)
      showAnother
    else
      showUnauthorized
    end
end

def showUnauthorized

    respond_to do |format|
      format.html # showUnauthorized.html.erb
    end
end

def showMine

    respond_to do |format|
      format.html # showMine.html.erb
    end
end

def showAnother

    respond_to do |format|
      format.html # showAnother.html.erb
    end
end

我收到模板丢失错误,因为 rails 想要在调用“show”时呈现视图,但我不希望在调用“show”时呈现任何视图。我只是想让“show”从那里调用正确的方法,并渲染该方法的相应视图(showMine、showAnother 或 showUnauthorized)。我怎样才能做到这一点?还是我完全以错误的方式解决这个问题?

4

2 回答 2

3

您需要声明您在路由文件中创建的这些新操作,因为它们不属于 RESTful 路由。
我建议只在控制器中保留显示操作,并使用 render 方法在显示视图中创建 IF 以包含部分(_showMine.html.erb,showAnother.html.erb,showUnauthorized)

例子:

显示视图:

if (something)
  <%= render 'showMine' %>
elsif (something else)
  <%= render 'showAnother' %>
else
  <%= render 'showUnauthorized' %>
end

我希望它有帮助...

于 2012-05-30T00:06:59.133 回答
2

我基本上同意 Samy 的评论,但这里有一些背景:

告诉 Rails 使用什么视图的方法是render. 如果在您的方法中没有调用该方法show,Rails 假定您有一个名为 的视图show.xxx.xxx,例如show.html.erb,它应该被渲染。请注意,它不假定模板将带有前缀,show因为那是方法的名称。它假定它将是show因为那是动作的名称。动作的名称作为请求的一部分传递给控制器​​;它不是简单地从其中包含块的任何方法的名称派生而来respond_to

所有respond_to块所做的只是根据请求的 MIME 类型指定不同的视图模板,但是由于您从未调用过render,所有这些额外的方法仍在尝试调用show视图(show.html.erb在每种情况下),因为您从未将 Rails 告诉render任何其他人视图,动作名称为show

因此,只需调用render [some_view]其他每个方法,而不是 respond_to 块。

这可能不是最明确的答案,但我建议您也阅读以下内容:

http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/

它描述了做什么respond_to,特别是它如何关闭动作名称以确定要呈现的视图。

于 2012-05-30T02:40:03.033 回答