2009-10-10 33 views
27

Tôi có một biểu mẫu hiển thị khác nhau tùy thuộc vào thông số được gọi.Đường ray: Truyền tham số có hiển thị: hành động?

Ví dụ:

testsite.local/users/new?type=client 

Vì vậy, nếu typea hoặc b, hình thức sẽ hiển thị các lĩnh vực khác nhau.

Vấn đề của tôi là khi biểu mẫu được điền không chính xác, vì nếu người dùng không thể lưu một cách chính xác, nó sẽ hiển thị biểu mẫu với các thông báo lỗi mặc định, nhưng cũng không có tham số của tôi.

testsite.local/users/new 

Làm cách nào tôi có thể gọi cho hành động render và chuyển bất kỳ thông số này nào được đặt cho nó? Vì vậy mà tôi vẫn có thể giữ các thông báo lỗi tích hợp của tôi về lý do tại sao biểu mẫu không thể bị sứt mẻ đúng cách VÀ nó có phải là hình thức đúng không?

Dưới đây là create hành động của tôi:

def create 
    @user = User.new(params[:user]) 
    roles = params[:user][:assigned_roles] 
    if @user.save 
    update_user_roles(@user,roles) 
    if current_user.is_admin_or_root? 
     flash[:message] = "User \"#{@user.username}\" created." 
     redirect_to users_path 
    else 
     flash[:message] = "Congrats! You're now registered!" 
     redirect_to app_path 
    end 
    else 
    render :action => 'new' 
    end 
end 

Trả lời

18

Như làm sáng tỏ bởi một người dùng khác trả lời khác related question của tôi, đây là những gì tôi đã sau:

form_for @user, :url => { :action => :create, :type => @type } 

... mà bảo tham số :type qua từng hành động làm mới (giả sử tôi có nó được xác định một cách chính xác trong điều khiển của tôi).

+1

Bạn sẽ làm gì khi muốn xác định điều tương tự cho cả hành động 'create' và' update'? – Victor

6

Extract cho Rails Hướng dẫn

Sử dụng render với: hành động là một nguyên nhân thường xuyên gây nhầm lẫn cho người mới Rails. Các hành động cụ thể được sử dụng để xác định xem để render, nhưng Rails không chạy bất kỳ mã cho rằng hành động trong bộ điều khiển

Tôi tin rằng bạn new?type=client được sử dụng để thiết lập một số loại biến trong hành động mới của bạn? Và biến này sau đó được sử dụng trong chế độ xem new.html.erb của bạn?

Sau đó, bạn cần phải thay đổi một chút tạo hành động của bạn như thế này:

else 
    # add code here to setup any variable for type = client 
    # and which will be used in your view 
    render :action => 'new' 
    end 
end 
+1

Vâng, điều này vẫn phá vỡ tính nhất quán trực quan của đường dẫn URL của tôi, như vậy, khi gửi không thành công biểu mẫu, url thay đổi từ 'new? Type = client' thành chỉ mới'. Không có cách nào để đặt thông số url cho hành động vừa mới hiển thị không? Hay tôi vẫn còn thiếu cái gì ở đây? – neezer

+0

wow, điều này khiến tôi rất thất vọng. tại sao nó không tải lại hành động mới? Tôi phải sao chép/dán mã không tối ưu. – Danny

3

Bạn luôn có thể buộc nó bằng cách:

params[:type] ||= "client" 

trong hành động mới của bạn trong điều khiển của bạn. Nếu loại không được đặt thì nó sẽ mặc định cho máy khách. Tuy nhiên, URL sẽ không hiển thị điều này.

+0

Hiện có cách nào để URL hiển thị thông tin này không? – neezer

13

Có hai cách để thực hiện.

Hoặc thêm một lĩnh vực ẩn hoặc một tham số bổ sung cho các form_for

Thêm lĩnh vực ẩn trong hình thức của bạn chứa tên loại và thiết lập nó bằng params [: type] này sẽ bảo vệ các loại trên render nếu xác nhận thất bại .

Xem mã:

<% form_for @user do |f| %> 
... 
<%= hidden_field_tag :type, params[:type] %> 
<%end%> 

Thêm một paramater bổ sung cho các hình thức:

<% form_for @user, create_user_path(@user, :type => params[:type]) %> 
... 
<%end%> 

Hoặc ai sẽ làm những gì bạn muốn nó.

+0

Bạn sẽ phân biệt hình thức giữa việc cập nhật và tạo ra như thế nào? – Sean

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