2016-09-12 14 views
5

私はRuby on Railsをbookを使って学んでいます。 私はhereから2番目の練習に立ち往生しています。部分的にパスを使用する変数

app/views/users/_form.html.erb部分私のフォームは次のようになります。部分と

<%= form_for(@user, url: yield(:path)) do |f| %> 
    <%= render 'shared/error_messages', object: @user %> 

    <%= f.label :name %> 
    <%= f.text_field :name, class: 'form-control' %> 

    <%= f.label :email %> 
    <%= f.email_field :email, class: 'form-control' %> 

    <%= f.label :password %> 
    <%= f.password_field :password, class: 'form-control' %> 

    <%= f.label :password_confirmation %> 
    <%= f.password_field :password_confirmation, class: 'form-control' %> 

    <%= f.submit yield(:button_text), class: "btn btn-primary" %> 
<% end %> 

私のサインアップビューapp/views/users/new.html.erbはこれです:

<% provide(:title, 'Sign up') %> 
<% provide(:button_text, 'Create my account') %> 
<% provide(:path, signup_path) %> 
<h1>Sign Up</h1> 
<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= render 'form' %> 
    </div> 
</div> 

と私の編集ビューapp/views/users/edit.html.erbはこれです:

<% provide(:title, "Edit user") %> 
<% provide(:button_text, "Save changes") %> 
<% provide(:url, user_path) %> 
<h1>Update your profile</h1> 
<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= render 'form' %> 
    <div class="gravatar_edit"> 
     <%= gravatar_for @user %> 
     <a href="http://gravatar.com/emails" target="_blank" rel="noopener noreferrer">Change</a> 
    </div> 
    </div> 
</div> 

私の問題は、どのような正しい経路がわからないということです。 r 編集ビュー私はと設定する必要がありますメソッドを設定します。

signup_pathサインアップビューで正常に動作します。私は、編集ビューの試みはある:(現在のコード例で)

  • user_path
  • edit_user_path
  • edit_user_path(@user)現在のルーティングエラーI以下

(ユーザオブジェクトを渡します) got、ユーザに関連する利用可能なルートより下:

enter image description here

たとえば私は、URLを提供するために、編集ビューを提供し使用していない場合、それはここのように正常に動作します:

<%= form_for(@user) do |f| %> 
    <%= render 'shared/error_messages', object: @user %> 

    <%= f.label :name %> 
    <%= f.text_field :name, class: 'form-control' %> 

    <%= f.label :email %> 
    <%= f.email_field :email, class: 'form-control' %> 

    <%= f.label :password %> 
    <%= f.password_field :password, class: 'form-control' %> 

    <%= f.label :password_confirmation %> 
    <%= f.password_field :password_confirmation, class: 'form-control' %> 

    <%= f.submit yield(:button_text), class: "btn btn-primary" %> 
<% end %> 

しかし、目的はパーシャルを使用してコードをリファクタリングすることです、私はサインアップビューのためのURLを提供する必要があります。 routes.rb

Rails.application.routes.draw do 
    get 'sessions/new' 

    get 'users/new' 

    root 'static_pages#home' 
    get '/help', to: 'static_pages#help' 
    get '/about', to: 'static_pages#about' 
    get '/contact', to: 'static_pages#contact' 
    get '/signup', to: 'users#new' 
    post '/signup', to: 'users#create' 
    get '/login', to: 'sessions#new' 
    post '/login', to: 'sessions#create' 
    delete '/logout', to: 'sessions#destroy' 
    resources :users 
end 
+0

あなたが一部を投稿することができあなたの 'routes.rb'のどこにあなたのパスを設定するのですか? – mrzasa

+0

あなたはプロセスを見てみる必要があります。レールとそのフォームがアクティブなレコードでどのように動作するか。モデルを備えた足場コントローラを生成してください。あなたは間違いなくすぐに学びます。 –

+0

は 'routes.rb' @mrzasa – ronatory

答えて

2

最後に、必要なURLを2番目の練習問題hereから渡すと、それはちょうどuser_pathを提供するように機能します。私が私の質問で述べたように、私はすでにuser_pathで試してみましたが、私が見ていないのは、私が部分的にyield(:path)という形でURLを埋め込むために使っていたということでした。編集画面では<% provide(:url, user_path) %>を使用しました。編集ビューから適切なパスを指定することはできませんが、私が試して説明したように正しいパスを設定しても、明らかです。

あなたが変数を正しく割り当てたかどうかを正確に見て、の後に自分自身で試してみた後で、その運動にもかかわらず取り残された人のために。サインアップビューapp/views/users/new.html.erb

<%= form_for(@user, url: yield(:path)) do |f| %> 
    <%= render 'shared/error_messages', object: @user %> 

    <%= f.label :name %> 
    <%= f.text_field :name, class: 'form-control' %> 

    <%= f.label :email %> 
    <%= f.email_field :email, class: 'form-control' %> 

    <%= f.label :password %> 
    <%= f.password_field :password, class: 'form-control' %> 

    <%= f.label :password_confirmation %> 
    <%= f.password_field :password_confirmation, class: 'form-control' %> 

    <%= f.submit yield(:button_text), class: "btn btn-primary" %> 
<% end %> 

部分app/views/users/_form.html.erb形式:

<% provide(:title, 'Sign up') %> 
<% provide(:button_text, 'Create my account') %> 
<% provide(:path, signup_path) %> 

<h1>Sign Up</h1> 
<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= render 'form' %> 
    </div> 
</div> 

編集ビューapp/views/users/edit.html.erb:これは私の実用的なソリューションである

<% provide(:title, "Edit user") %> 
<% provide(:button_text, "Save changes") %> 
<% provide(:path, user_path) %> 

<h1>Update your profile</h1> 
<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= render 'form' %> 
    <div class="gravatar_edit"> 
     <%= gravatar_for @user %> 
     <a href="http://gravatar.com/emails" target="_blank" rel="noopener noreferrer">Change</a> 
    </div> 
    </div> 
</div> 
0

あなたはパスを宣言する必要はありません。 resources :usersを使用している場合。アプリケーションはパスを設定する方法を知っています。あなたが宣言する場合:

new_user_path 

いますが、宣言した場合::

@user = User.new 

をパスになります

@user = User.find(params[:id]) 

をパスは次のようになります。

user_path(id) 

http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html

+0

私は 'resources:users'を使ってパスを宣言する必要はないことを理解していますが、この場合はサインアップビューと編集ビューを提供する必要があります。したがって、サインアップビューにはurlが必要です(この場合は 'signup_path')。これを提供するために、私はこれを 'form_for(@user、 '/ signup')'のようにsignup_pathを** _ form部分**に設定します。編集ビューの正しいパスである私の質問、または編集ビューで 'form_for'が' form_for(@user)のように見えるようにする方法を避けることができますか? ' – ronatory

関連する問題