我很难理解Rails的一般应用程序布局。
基本上,我正在制作一个用于足球比赛的网络应用。教练登录并进入/ coach / index页面。他们可以在该页面上使用JavaScript前端绘制剧本等。我的问题是,为了保存播放,我需要将该JSON发送到服务器,以将其记录在正确的Play数据库条目中。
从逻辑上说我的布局正确吗?像这样,教练应该登录才能将他带到该页面,然后他将剧本吸引到那里并保存,创建新剧本,加载它们等,还是应该在由Play控制器控制的页面上执行此操作?
我想将游戏绘图引擎生成的JSON保存到数据库。最好的方法是什么?我看到的所有Rails AJAX教程都是基于简单的形式,您可以在其中设置remote => true属性等等。如何在不使用显式表单的情况下对Rails DB进行AJAX POST / GET,并处理输入?
这可能是由于我缺乏Rails的专业知识(我一直在尝试学习),但是,以您更有经验的观点,这是确保我向教练展示正确比赛的最佳方法,做他们?我在理解控制器如何访问由其他控制器控制的事物方面有些挣扎。我确信这类事情一定有一些约定。
我考虑得越多,对我来说登录越应该使您进入/ plays目录,并且我应该在其中修改create等,以便执行我想做的事情。
提前致谢。
最佳答案
您的布局合理吗? /coaches
作为登录的Coaches的目的地是有意义的。如果您的应用程序用户仅是Coach,那么即使是root也可以。当Coach登录时,他将使用某种形式的coaches#show
,但这并不意味着您在做错误的事情只是因为URL类似于/profile
。并非所有内容都需要在URL端遵守完整的REST.。在现实世界中,从来没有new
动作驻留在它自己的小古朴页面上。如果有必要在/coaches
页面上嵌套一个新的Play表单,则您的URL不需要反映它。
控制器控制与资源的交互。在/coaches
页面上,您仍将向plays#destroy
发送删除播放请求,并通过plays#create
验证新播放,这可以render 'coaches/index' when it fails.
我从未真正在Rails中处理过AJAX。
确保教练只看自己的比赛的最好方法是通过Coach has_many :plays
关联来确定他们的范围。 Rails身份验证解决方案(例如Devise)中的约定是提供方法current_user
,该方法返回当前登录用户的User模型的实例。
您的coaches#index
动作可能类似于:
# Coaches controller
def index
@plays = current_user.plays
end
然后您的视图可能有:
# views/coaches/index.erb
<ul>
<% for play in @plays %>
<li><%= play.name %></li>
<% end %>
</ul>
您不会做的:
@plays = Play.where(:user_id => @user.id)
。它还简化并保护了其他操作。考虑:
@play = current_user.plays.new
@play = current_user.plays.build(:name => "My First Play")
redirect_to @play, :notice => "Success!" if @play.save
current_user.plays.find(params[:id]).destroy
要回答添加为评论的问题:
# Coaches controller
def new
@play = current_user.plays.new
end
def create
@play = current_user.plays.build(params[:play]) # @play now already contains the association to the coach that created it.
if @play.save!
redirect_to # somewhere
else
render 'coaches/index'
end
end
如果您不熟悉Railscasts,我强烈建议您使用它们。即使观看您不会很快实施的主题的剧集,也可以使您获得很好的曝光率。
例如,这是一个Railscast on Devise。 Devise在Github上也有不错的文档。
我最近在Rals Best Practices上购买了CodeSchool的产品。即使其中某些内容可能超出您的直接掌握范围,但您可以随时重新访问它。我一直在查阅随附的幻灯片,以寻找更好的做事方法。