我正在构建一个相当简单的配方应用程序来学习RoR,我试图让用户通过单击链接而不是通过表单来保存配方,所以我通过一个连接user_recipe控制器的'创建'功能链接到。
不幸的是,由于某种原因,link_to正在调用索引函数而不是create。
我已将link_to写为
<%= "save this recipe", :action => 'create', :recipe_id => @recipe %>
此链接位于user_recipes / index.html.erb上,并且正在调用同一控制器的“create”功能。如果我包含:controller,它似乎没有什么区别。
控制器看起来像这样
def index @recipe = params[:recipe_id] @user_recipes = UserRecipes.all # change to find when more than one user in db respond_to do |format| format.html #index.html.erb format.xml { render :xml => @recipes } end end def create @user_recipe = UserRecipe.new @user_recipe.recipe_id = params[:recipe_id] @user_recipe.user_id = current_user respond_to do |format| if @menu_recipe.save format.html { redirect_to(r, :notice => 'Menu was successfully created.') } format.xml { render :xml => @menu, :status => :created, :location => @menu } else format.html { render :action => "new" } format.xml { render :xml => @menu.errors, :status => :unprocessable_entity } end end
答案 0 :(得分:39)
在标准REST方案中,索引操作和创建操作都具有相同的URL(/recipes
),并且仅在使用GET访问索引并且使用POST访问create时才有区别。因此,link_to :action => :create
只会生成/recipes
的链接,这会导致浏览器在点击时执行/recipes
的GET请求,从而调用索引操作。
要调用创建操作,请使用link_to {:action => :create}, :method => :post
,明确告知link_to
您要发布请求,或使用带有提交按钮而非链接的表单。
答案 1 :(得分:11)
假设您在路线文件中设置了默认资源,例如此类
resources :recipes
以下将生成一个创建配方的链接;即将被路由到创建动作。
<%= link_to "Create Recipe", recipes_path, :method => :post %>
为了实现这一点,需要在浏览器中启用JS。
以下将生成一个显示所有食谱的链接;即将被路由到索引行动。
<%= link_to "All Recipes", recipes_path %>
这假定默认为Get HTTP请求。