如何在Rails中有条件视图?

时间:2014-10-10 07:43:06

标签: ruby-on-rails views conditional

我在应用中看到了一个我希望能够实现的功能。该应用程序有几个资源 - 照片,文章等..在照片和文章选项卡旁边的导航栏中有两个按钮 - 组织和个人。当用户单击组织按钮然后单击照片或文章时,他们会获得属于其组织成员的所有照片和文章的列表。如果他们点击了个人按钮,之后他们点击了照片或文章,他们只获得了他们的个人照片和文章的列表,省略了属于其组织其他成员的资源。所以我想知道请求之间是如何保持这种状态的。

我想,一种方法是在视图和控制器之间不断传递变量,并根据该变量列出特定资源。或者可以在会话中保存状态(尽管我认为这应该作为最后的手段来完成)。另一种方法是使用像draper这样的装饰器,但我对实现它的具体细节感到困惑。如果有人向我指出一篇文章或教程,展示如何实现这样的功能,或者仅提供步骤的概述,我将非常感激。

要清楚,再说一遍:有索引不同资源的链接,但基于参数,相应控制器的索引操作返回不同的结果。类似的东西:

def index
  if params[:type] == 'organization'
    @photos = Organization.find_by(id: params[:organization][:id]).photos
  else
    @photos = User.find_by(id: params[:user][:id]).photos
  end
end

问题是 - 我如何传递type参数 - 在路径助手中使用硬编码,并为该参数设置不同的不同视图,还是有更好的方法?

这是我模特的关系:


class User < ActiveRecord::Base

  belongs_to :organization,
    inverse_of: :members

  has_many :photos,
    inverse_of: :owner,
    foreign_key: :owner_id,
    dependent: :destroy

  ...
end

class Photo < ActiveRecord::Base

  belongs_to :owner,
    class_name: User,
    inverse_of: :photos

  belongs_to :organization,
    inverse_of: :photos

  ...
end

class Organization < ActiveRecord::Base

  has_many :members,
    class_name: User,
    inverse_of: :organization,
    dependent: :destroy
  has_many :photos,
    inverse_of: :organization,
    dependent: :destroy

  ...
end

2 个答案:

答案 0 :(得分:1)

通过重新加载包含网址参数的网页

我有一个类似的问题,根据你的需要,有几种不同的传递参数的方法。我实际上只是通过网址传递它们。如果您将?type=organization附加到您的网址,则会在您的参数'type' => 'organization'中获得一个额外的键值对,您可以使用它。如果您想通过链接转到此网址,则可以执行link_to photos_path + "?type=organization"。我最终使用了javascript,因为我想要的不是链接。无论您的html元素是什么,请为其指定属性onclick=changeParam(),然后在您的javascript中定义该函数。

function changeParam() {
    window.location.search = "?type=organization"
}

这会自动使用该参数重新加载同一页面。如果您想要多个,请将&param2=value2附加到目前为止的内容。

通过AJAX

如果您不想完全刷新页面,也可以使用AJAX传递参数。如果您已经知道如何使用AJAX,只需使用数据选项:

$.ajax({
        type: "GET",
        url: "/photos",
        data: { type : organization, param2 : value2 }
})

在这种情况下,您的参数通过数据发送。如果您想了解更多有关AJAX以及如何使用它的信息,请告诉我,我将更新我的答案并提供更多详细信息。它在Rails中相当混乱,而且没有好的文档,所以如果你愿意,我会添加我知道的内容。

答案 1 :(得分:0)

它可以通过许多不同的方式解决,但是,例如,如果我理解你,其中之一是资源照片,文章等..有一个字段可以是'组织'或'个人'。之后,通过在应用程序中单击此按钮,您可以按该字段过滤资源(文章,照片......)。

一切都取决于具体情况,也许另一种解决方案是创建一个完全分离的模块,你要存储组织,个人等等。如果你想扩展后者以及组织旁边和个人添加其他东西,那就更好了。 / p>

正如我所说,一切都取决于情况和项目。

附加:

好的,从您的示例中我可以看到,通过点击,例如,用户链接,您将拥有用户ID。因此,您可以轻松显示该用户的所有照片:

# params[id] - user id which is got by clicking

user = User.find(params[id])
@photos = user.photos