在我的Rails应用中,我有用户,这些可以创建与其帐户相关联的帖子。我有一条路线“/api/:user_id/submissions/:id(.:format)”=> “submissions#usersubmission”成功将显示用户发布的内容,如果id与其关联的内容匹配。
我现在要做的是在前端通过AngularJS显示用户帖子。我不确定如何将:user_id传递给API调用。以下是我的观点:
<div id="submission-list-container">
<ul id="indexSubmissions">
<li ng-repeat="submission in userSubmissions">
<a href="/submissions/{{submission.id}}"><h3 id="submissionh3">{{submission.title}} <small>{{submissionPreview(submission.content)}}</small></h3></a>
<h1>{{submission.user.email}}</h1>
<a id="edit_button" href="/submissions/{{submission.id}}/edit">Edit</a>
</li>
</ul>
</div>
这是我的工厂:
BrainDB.factory('userSubmission', function($resource) {
var service = $resource('/api/:user_id/submissions/:id', {user_id: '@user_id'}, {id: '@id'} );
return service;
});
被调用的控制器动作:
def usersubmission
@user = User.find(params[:user_id])
@submissions = @user.submissions
@submission = @submissions.find(params[:id])
render json: @submission
end
“BrainDB”Angular控制器只是.query()是userSubmission工厂。在'userSubmission'工厂中,我不确定如何建立关联:user_id,以便它成功返回JSON中所有用户的帖子。有什么建议吗?
答案 0 :(得分:3)
永远不应该从客户端发送用户。您应永远信任客户。
您的rails应用程序应该有一个会话,您应该将当前用户存储在会话中的某个位置。 (会话是一个哈希值,如果您手动执行它只需使用一个敏感键来存储当前用户的ID)。您在登录时执行此操作,之后只需检索它。
class ApplicationController < ActionController::Base
attr_accessor :current_user
before_filter :load_current_user
# ...
private
def load_current_user
self.current_user = User.find(session[:user_id])
end
end
在你的控制器中:
def usersubmission
@submissions = current_user.submissions
@submission = @submissions.find(params[:id])
render json: @submission
end
如果你使用Devise或类似的东西,那么它更容易,因为这些类已经在控制器中注入current_user
(或类似命名的方法)。