Rails在不同控制器中的渲染动作

时间:2009-12-22 21:05:30

标签: ruby-on-rails

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

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

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

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

谢谢!

7 个答案:

答案 0 :(得分:2)

听起来像音乐应该是歌曲的一部分,或者相反。您始终可以使用路由将其伪装成用户的一个或另一个。 歌曲/索引听起来像它应该显示所有歌曲,无论如何都是音乐。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

如果你开始在边缘跑,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模板返回类型重新加载整个歌曲列表成功。

答案 3 :(得分:1)

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

render template: 'music/index'

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

您可以尝试render :file => ...