我在应用中看到了一个我希望能够实现的功能。该应用程序有几个资源 - 照片,文章等..在照片和文章选项卡旁边的导航栏中有两个按钮 - 组织和个人。当用户单击组织按钮然后单击照片或文章时,他们会获得属于其组织成员的所有照片和文章的列表。如果他们点击了个人按钮,之后他们点击了照片或文章,他们只获得了他们的个人照片和文章的列表,省略了属于其组织其他成员的资源。所以我想知道请求之间是如何保持这种状态的。
我想,一种方法是在视图和控制器之间不断传递变量,并根据该变量列出特定资源。或者可以在会话中保存状态(尽管我认为这应该作为最后的手段来完成)。另一种方法是使用像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
答案 0 :(得分:1)
通过重新加载包含网址参数的网页
我有一个类似的问题,根据你的需要,有几种不同的传递参数的方法。我实际上只是通过网址传递它们。如果您将?type=organization
附加到您的网址,则会在您的参数'type' => 'organization'
中获得一个额外的键值对,您可以使用它。如果您想通过链接转到此网址,则可以执行link_to photos_path + "?type=organization"
。我最终使用了javascript,因为我想要的不是链接。无论您的html元素是什么,请为其指定属性onclick=changeParam()
,然后在您的javascript中定义该函数。
function changeParam() {
window.location.search = "?type=organization"
}
这会自动使用该参数重新加载同一页面。如果您想要多个,请将¶m2=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