0

我试图在“me”/me 部分下命名多个路由,以便在此命名空间下拥有所有基于用户配置文件/帐户的内容,以实现更干净的路由。

解决这个问题的最佳方法是什么?我发现重写默认的 REST 路由 (profiles/1/edit) 会出现一些问题,例如表单不更新。

路线

get "/me/profile"              => "profiles#show", :as => :my_profile
get "/me/profile/:what"        => "profiles#edit", :as => :my_profile_edit
post "/me/profile/:what"       => "profiles#edit"

ProfilesController

def edit
  @profile      = current_user.profile
  if ["basics", "location", "details", "photos"].member?(params[:what])
    render :action => "edit/edit_#{params[:what]}"
  else
    render :action => "edit/edit_basics"
  end
end

def update
  @profile        = current_user.profile
  @profile.form   = params[:form]
  respond_to do |format|
    if @profile.update_attributes!(params[:profile])
      format.html { redirect_to :back, :notice => t('notice.saved') }
    else
      format.html { render action => "/me/profile/" + @profile.form }
    end
  end
end

如果感觉上面对 REST 原则很不利。我怎样才能以更好的方式实现想要的结果?

4

1 回答 1

1

好吧,如果你真的很想坚持使用 REST,我建议将其移动:what到 GET params 哈希中。然后你可以像这样重写你的路线

scope "/me" do
  resource :profile, :only => [:show, :edit, :update]

因此,您将编辑页面称为profile_edit_path(:what => "details")

结合更多关于您的代码的内容。

  • 你应该update_attributes改为update
  • 你不应该使用重定向:back,因为它会渲染一个 js 反向链接而不是做实际的请求,所以你不会看到实际的变化
  • 你应该render action =>改为render :template =>
  • params[:profile]除非您使用 strong_params,否则不应在更新语句中使用。您需要指定表单允许的参数。这样做是为了防止大规模分配。

认为您应该真正查看Rails 4 上的 CodeSchool 教程

于 2013-09-14T19:45:06.303 回答