【问题标题】:Rails Rendering Action in Different ControllerRails 在不同控制器中的渲染动作
【发布时间】:2009-12-22 21:05:30
【问题描述】:

所以我有一个名为 Music 的控制器,其中一个动作是 index.html。在music/index.html 页面上,我列出了一堆歌曲(通过 Song 模型),在底部我有一个创建新歌曲的 for。

Song 具有我已经测试过并且工作正常的验证。当新歌曲保存在控制器歌曲操作中时,创建 I redirect_to => 'music_index_path' 以便该人可以在列表中看到新歌曲。但是,当歌曲未保存(未通过验证)时,我无法使用 redirect_to,因为 error_messages 表单不会延续。我需要使用render,但不能说render :controller => 'music', :action => 'index

我的目标是能够在 music/index.html 页面上显示歌曲表单的错误消息。

我应该怎么做。我也对其他想法持开放态度(例如更换控制器)。

谢谢!

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    在我看来,音乐应该是歌曲的一部分,或者相反。您始终可以使用路由将其伪装成一种或另一种给用户。 歌曲/索引对我来说听起来应该显示所有歌曲,这就是所有音乐所做的。

    【讨论】:

    • 我会玩弄这些路线......这可能会让我到达我想去的地方。
    【解决方案2】:

    我的第一个想法是我们需要重新考虑这个过程。假设您使用的是 RESTful 控制器,我不清楚为什么需要 Music 控制器和 Song 控制器……这些资源有何不同?下一个相关问题是,为什么通过 Song#create 显示错误还不够?我的意思是,当它只是一种形式时,他们无法做到正确,额外内容的分心可能会有所帮助吗? :)

    话虽如此,这是一个可能的解决方案。 (鉴于您没有粘贴代码,我在这里做了很多假设。)

    <hack> 首先,将表单部分从歌曲/新提取到歌曲/_form,然后从音乐/索引视图中,渲染:partial => 歌曲/_form,并在歌曲控制器中,渲染:action => '../music/index ' (这被称为 hackity-hack。)因为它是 hack,你几乎肯定需要进入 music#index 并添加 @song = Song.new </hack>

    【讨论】:

    • 资源本身是一首歌曲,但我不希望 URL 显示歌曲一词...我正在尝试为婚礼创建歌曲推荐页面,我希望 URL 为/music 或类似的显示一堆歌曲的东西。进一步考虑,我可以将地图/音乐添加到 :controller => 'songs', :action => 'index' 的路线。
    【解决方案3】:

    如果您开始在边缘运行,the ability to pass a flash through a redirect was just added...但这并不能真正让您到达那里。

    不过,最简单的解决方案是您需要呈现索引,但设置该页面所需的所有变量。如果将其分解为单独的模块或方法,则可以从索引操作和保存失败中调用它。

    def index
      setup_for_index
    end
    
    def create
       @song = Song.new(params[:song])
       @song.save
       #...
       #on failure
         setup_for_index
         render :controller => "music", :action => "index"
    end
    
    def setup_for_index
      @songs = Song.all
      #etc
    end
    

    您可以做的另一件事是使用form_remote_for 并让歌曲形式在失败时更新 div。然后使用 RJS 模板返回类型在成功时重新加载整个歌曲列表。

    【讨论】:

      【解决方案4】:

      虽然我想重申其他人所说的关于您的资源架构值得重新审视的内容,you can certainly render views for other resources using the :template option

      render template: 'music/index'
      

      【讨论】:

        【解决方案5】:

        为什么不是一个简单的 if request.post?在索引操作的视图中有条件而不是重定向到另一个页面?

        【讨论】:

          【解决方案6】:

          您也可以尝试使用flash[:song_save_error] 将错误情况传递回您的音乐控制器。

          http://api.rubyonrails.org/classes/ActionController/Flash.html

          【讨论】:

            【解决方案7】:

            你可以试试render :file => ...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-16
              • 2014-11-26
              • 1970-01-01
              • 2011-08-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多