我很难理解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的产品。即使其中某些内容可能超出您的直接掌握范围,但您可以随时重新访问它。我一直在查阅随附的幻灯片,以寻找更好的做事方法。

10-06 04:25
查看更多