我对rails params有一些奇怪的问题。我有两个模型:Page和NewsItem。
页面:has_many :news_items
和
NewsItem:belongs_to :page
在我创建新news_item
的表单中,我有一个单选按钮列表,我可以使用这些按钮选择新创建的项目所属的page
。
到目前为止,一切正常。困扰我的是:
当我选择第一个选项(页面没有父级 - >传递的值应为nil
)时,page_id
参数中实际传递的值为"on"
!
所以我几乎没有问题:
由于我需要检查params的值以进行正确的重定向,我想知道我可以依靠page_id
使用值"on"
来表示{{1} }?这是rails中标准nil
的标准方式,还是特定于我的设置?在将来的版本中是否有可能改变这种情况?
正如您在帖子底部的控制台中看到的哈希,在选择nil
作为要作为外键传递的值(nil
)后,实际设置为page_id的值不是page_id
而是nil
。这是说明此项目不属于某个页面的好方法,还是应该尝试强制该值为0
?我应该传递零值而不是nil
吗?
表是否有可能有一个主id为零的行?
我正在开发中使用sqlite
在rails 4.0.4上运行它以下是带有单选按钮的表单部分:
nil
以下是来自请求的实际params哈希:
<ul>
<li>
<%= f.radio_button :page_id, nil %>
<%= f.label :page_id, t('page_no_parent'), value: nil %>
</li>
<% @parents.each do |page| %>
<li>
<%= f.radio_button :page_id, page.id %>
<%= f.label :page_id, page.name, value: page.id %>
</li>
<% end %>
</ul>
这是来自控制台的项目哈希:
Started PATCH "/hr/admin/news_items/37" for 127.0.0.1
Processing by Admin::NewsItemsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"blablablablablaabllba",
"commit"=>"Save content to page", "news_item"=>{"name"=>"test new",
"title"=>"", "body"=>"", "author"=>"", "page_id"=>"on"},
"locale"=>"hr", "id"=>"37"}
请注意,我试图谷歌这个,但无法找到任何东西......
更新:
我意识到这种情况发生的方式是因为我有以下路线:
2.0.0p353 :124 > NewsItem.find(37)
NewsItem Load (0.3ms) SELECT "news_items".* FROM "news_items" WHERE "news_items"."id" = ? LIMIT 1 [["id", 37]]
=> #<NewsItem id: 37, name: "test new", url: nil, title: "", body: "", author: "",
page_id: 0, user_id: 7, created_at: "nvm", updated_at: "nvm">
我尝试在url中为 resources :pages do
resources :news_items, except: [:index, :show]
end
resources :news_items
添加:news_items
page_id
启用CRUD。因此,在删除后,我尝试根据params
中的值重定向到正确的路线。
if params[:news_item].key? :page_id and not params[:news_item][:page_id].nil?
admin_page_path(Page.find(params[:news_item][:page_id]))
else
admin_news_items_path
end
因此,如果:page_id
不是nil
路由到相应的网页,则路由到NewsItem#index
。
但我一直在说错误:
ActiveRecord::RecordNotFound in Admin::NewsItemsController#update
Couldn't find Page with id=on
如果我传递零而不是nil,一切都按预期工作。这是表示某行没有外键的好方法吗?