传递nil作为外键时params中的奇怪值

时间:2014-08-08 20:27:25

标签: ruby-on-rails activerecord params

我对rails params有一些奇怪的问题。我有两个模型:Page和NewsItem。

页面:has_many :news_items

NewsItem:belongs_to :page

在我创建新news_item的表单中,我有一个单选按钮列表,我可以使用这些按钮选择新创建的项目所属的page

到目前为止,一切正常。困扰我的是: 当我选择第一个选项(页面没有父级 - >传递的值应为nil)时,page_id参数中实际传递的值为"on"

所以我几乎没有问题:

  1. 由于我需要检查params的值以进行正确的重定向,我想知道我可以依靠page_id使用值"on"来表示{{1} }?这是rails中标准nil的标准方式,还是特定于我的设置?在将来的版本中是否有可能改变这种情况?

  2. 正如您在帖子底部的控制台中看到的哈希,在选择nil作为要作为外键传递的值(nil)后,实际设置为page_id的值不是page_id而是nil。这是说明此项目不属于某个页面的好方法,还是应该尝试强制该值为0?我应该传递零值而不是nil吗? 表是否有可能有一个主id为零的行?

  3. 我正在开发中使用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,一切都按预期工作。这是表示某行没有外键的好方法吗?

0 个答案:

没有答案