所以我有一个名为Music的控制器,其中一个动作是索引。在music/index.html
页面上,我列出了一堆歌曲(通过歌曲模型),在底部我有一个用于创建新歌曲。
Song已经过测试并且工作得很好。当新歌曲保存在控制器中时,歌曲动作创建I redirect_to => 'music_index_path'
,以便此人可以在列表中看到新歌曲。但是当歌曲没有保存(未通过验证)时,我无法使用redirect_to
,因为表单error_messages不会继承。我需要使用render
,但不能说render :controller => 'music', :action => 'index
。
我的目标是能够在music / index.html页面上显示歌曲表单的错误消息。
我应该怎么做呢。我也对其他想法(比如更换控制器)持开放态度。
谢谢!
答案 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 => ...