2010-09-17 19 views
18

Tôi đang xây dựng một ứng dụng công thức khá đơn giản để tìm hiểu RoR và tôi đang cố gắng cho phép người dùng lưu công thức bằng cách nhấp vào liên kết thay vì thông qua một biểu mẫu, vì vậy tôi đang kết nối chức năng 'create' của bộ điều khiển user_recipe thông qua một liên kết_to.link_to: action => 'create' sẽ lập chỉ mục thay vì 'create'

Thật không may, vì một số lý do, liên kết_to đang gọi hàm chỉ mục thay vì tạo.

Tôi đã viết link_to như

 
<%= "save this recipe", :action => 'create', :recipe_id => @recipe %> 

liên kết này là trên user_recipes/index.html.erb và là cách gọi 'tạo ra' Chức năng của bộ điều khiển tương tự. Nó dường như không tạo ra sự khác biệt nếu tôi bao gồm: điều khiển hay không.

Các bộ điều khiển giống như thế này

 
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 

Trả lời

37

Trong sơ đồ REST của tiêu chuẩn action index và hành động tạo ra cả hai đều có cùng một URL (/recipes) và chỉ khác nhau về chỉ số được truy cập sử dụng GET và tạo được truy cập sử dụng POST. Vì vậy, link_to :action => :create sẽ chỉ tạo liên kết đến /recipes sẽ khiến trình duyệt thực hiện yêu cầu GET cho /recipes khi được nhấp và do đó gọi hành động chỉ mục.

Để gọi hành động tạo sử dụng link_to {:action => :create}, :method => :post, yêu cầu link_to một cách rõ ràng rằng bạn muốn yêu cầu bài đăng hoặc sử dụng biểu mẫu có nút gửi thay vì liên kết.

+1

Cảm ơn Sepp2k, không chỉ để cung cấp câu trả lời, mà còn giải thích lý do tại sao rõ ràng như vậy. Nó là cái gì đó tôi thực sự đấu tranh với sự hiểu biết tại sao đường ray làm hoặc mong đợi một số bit, và thường là câu trả lời trực tuyến chỉ cung cấp cho 'đây là cách nó được thực hiện' mà không có lý do tại sao. Câu trả lời của bạn là hoàn hảo! – pedalpete

+0

'link_to {: action =>: create},: method =>: post' tạo liên kết với thuộc tính' data-method = "POST" '. Mà được sử dụng bởi các đường ray javascript để tạo ra một hình thức rời rạc và đăng nó. Không thể sử dụng các liên kết để gửi bất kỳ thứ gì ngoài các yêu cầu GET, đó là những gì xảy ra khi JS không thành công. – max

9

Giả sử bạn có nguồn tài nguyên mặc định thiết lập trong tập tin tuyến đường của bạn, ví dụ: một cái gì đó như thế này

resources :recipes 

Sau đây sẽ tạo ra một liên kết mà sẽ tạo ra một công thức; tức là sẽ được chuyển đến hành động tạo.

<%= link_to "Create Recipe", recipes_path, :method => :post %> 

Để làm việc này, JS cần được bật trong trình duyệt của bạn.

Sau đây sẽ tạo liên kết sẽ hiển thị tất cả công thức nấu ăn; tức là sẽ được chuyển đến hành động chỉ mục.

<%= link_to "All Recipes", recipes_path %> 

Giả định mặc định là yêu cầu Nhận HTTP.

Các vấn đề liên quan