RoR以“约会优于配置”而闻名,所以很可能我的问题已经解决了 - 我不知道我应该遵循的惯例。
我有2个模型对象,ParseException
和ParseResolution
,以及ParseResolution belongs_to
ParseException。
我只是在Rails脚手架上创建一个管理面板,我想添加一个新的ParseResolution对象,绑定到ParseException对象。
为两个模型生成控制器后,我从parse_resolution/new
添加了一个指向parse_exception/index
的链接。由于ParseResolution需要知道它正在解析哪个ParseException(belongs_to),我也将它作为参数传递:
<td><%= link_to 'Add Resolution', new_parse_resolution_path(:parse_exception => parse_exception) %></td>
到目前为止一切顺利。
在我的ParseResolution控制器中,我有:
def new
@parse_resolution = ParseResolution.new
@parse_resolution.parse_exception = ParseException.find(params[:parse_exception])
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @parse_resolution }
end
end
到目前为止一切顺利,因为我可以访问ERB文件中的ParseException对象并显示其详细信息。
然而,当我按下“创建”按钮添加我的新ParseResolution对象时,save方法会抱怨我没有为它提供ParseException,这是一个必需的列。
我尝试使用hidden_field执行此操作:
<%= hidden_field(:parse_resolution, :parse_exception) %>
但是这只是将实际的ParseException对象转换为字符串:
<input id="parse_resolution_parse_exception" name="parse_resolution[parse_exception]" type="hidden" value="#<ParseException:0x1108a8930>" />
这显然不起作用。
好的,所以我再次尝试 不要讨厌Ruby on Rails的所有类似巫术的约定。有人请赐教我最好的办法去做我想做的事吗?
答案 0 :(得分:2)
如果你想遵循良好做法,你应该这样做:
您对新建,创建,销毁操作的路径应如下所示:
parse_exceptions/:parse_exception_id/parse_resolutions/new
在routes.rb中将会是:
resources :parse_exceptions do
resources :parse_resolutions
end
然后你的新行动之路应该是这样的:
new_parse_exception_parse_resolution_path(@parse_exception)
(您还需要更改路径以在表单中创建操作)
然后在你的ParseResolutionsController中:
before_filter :load_parse_exception
.
def new
@parse_resolution = @parse_exception.parse_resolutions.new
end
def create
@parse_resolution = @parse_exception.parse_resolutions.new(params[:parse_collection]
.
.
end
private
def load_parse_exception
@parse_exception = ParseException.find params[:parse_exception_id]
end