【问题标题】:params of the model not being returned rails 3模型的参数未返回 rails 3
【发布时间】:2012-11-07 20:18:17
【问题描述】:

在此之前我已经发了几篇关于如何向用户添加最喜欢的食谱的帖子。我有一个应用程序,您可以在登录后上传食谱,用户可以在整个表格中搜索所有食谱并查看他们自己的食谱在会员区..

现在我希望用户能够保存他们最喜欢的食谱,到目前为止我可以保存最喜欢的食谱,我得到的输出是

[#<Favourite id: 1, user_id: 8, recipe_id: nil, created_at: "2012-11-06 19:25:34", updated_at: "2012-11-06 19:25:34">,

所以我得到了正确的 user_id 但没有实际食谱的参数,即菜名、原产国。

我的模特是这样的

用户

class User < ActiveRecord::Base

has_many :recipes 
has_many :favourites

食谱

has_many :ingredients 
has_many :preperations
has_many :favourites

收藏

belongs_to :user
belongs_to :recipe

我最喜欢的控制器是这样的

 def create

 @favourite = current_user.favourites.new(params[:recipe])
 if @favourite.save
 redirect_to my_recipes_path, :notice => "Recipe added to Favourites"
 end
end

添加到收藏链接

 <%= link_to "Add to favorites",  {:controller => 'favourites', :action => 'create'}, {:method => :post } %>

希望我没有遗漏任何东西,感谢任何帮助

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    您需要在链接中添加额外信息并修改创建操作

    # View
    <%= link_to "Add to favorites",  favorite_path(:recipe_id => @recipe.id), {:method => :post } %>
    
    # Controller
    def create
      @favourite = current_user.favourites.new(recipe_id: params[:recipe_id)
      if @favourite.save
       redirect_to my_recipes_path, :notice => "Recipe added to Favourites"
      end
    end
    

    问题是您在参数params[:recipe] 中没有向控制器发送任何内容

    注意:记住 attr_accessible :user_id, :recipe_id 内的 Favorite 模型。

    【讨论】:

    • 感谢您的回答,也尝试了您的方法,收到错误消息 Called id for nil,错误地为 4 - 如果您真的想要 nil 的 id,请使用 object_id
    【解决方案2】:

    如前所述

    <%= link_to "Add to favorites",  favorite_path(:recipe_id => @recipe.id), {:method => :post } %>
    

    但这一切都取决于你的控制器中定义的@recipe - 例如,如果你有

    @recipes = Recipie.all
    

    在你的视野中

    @recipes.all do |recipe|
    

    然后在您的链接中(在块内)您需要:

    <%= link_to "Add to favorites",  favorite_path(:recipe_id => recipe.id), {:method => :post } %>
    

    这有帮助吗?

    【讨论】:

      【解决方案3】:

      您没有通过链接发送任何参数。

      <%= link_to "Add to favorites",  {:controller => 'favourites', :action => 'create'}, {:method => :post } %>
      

      这还不足以将食谱添加到收藏夹。您需要做的是通过此链接传递食谱的 ID:

      <%= link_to "Add to favorites",  {:controller => 'favourites', :action => 'create', :recipe_id => recipe.id}, {:method => :post } %>
      

      或者你可以通过使用路由助手来缩短这个时间:

      <%= link_to "Add to favorites",  add_to_favorites_path(:recipe_id => recipe), {:method => :post } %>
      

      config/routes.rb 中定义路由助手,如下所示:

      post '/favorites' => "favorites#create", :as => "add_to_favorites"
      

      然后在控制器中找到带有params[:recipe_id] 的配方,然后用它做你需要做的事情。

      【讨论】:

      • 非常感谢您指出这一点,现在我得到未定义的局部变量或方法 `recipe' 虽然在尝试查看 my_recipes 页面时,我选择了选项 1
      • 哇,刚刚意识到你是合作编写 rails 3 的 Ryan Bigg,那本书在我的购买清单上 :)
      • 抱歉,好像我的问题没有找到,问题现在解决了
      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多