配置文件页面没有匹配的路由

时间:2016-03-01 20:19:21

标签: ruby-on-rails ruby user-profile

我目前正在编写代码,为每个登录我的应用程序的用户构建一个配置文件页面。但是我花了很多时间,似乎无法想出这个。请原谅我缺乏知识,我是初学者,现在还在学习。

我希望应用程序能够查看和编辑自己的个人资料。现在,当登录到应用程序时,它提供“无路由匹配{:action =&gt;”show“,:controller =&gt;”profiles“,:id =&gt; nil}缺少必需的键:[:id]”< / p>

_navigation_links.html.erb

<% if user_signed_in? %>
  <li><%= link_to('Sign Out', destroy_user_session_path, :method => :delete) %></li>      
  <li><%= link_to "View Profile", profile_path(@profile) %></li>
  <li><%= link_to 'Edit', edit_profile_path(@profile) %></li> 
<% else %>
  <li><%= link_to "Sign Up", new_user_registration_path %></li>
  <li><%= link_to "Sign In", new_user_session_path %></li>
<% end %>

profiles_controller.rb

class ProfilesController < ApplicationController
   before_action :find_profile, only: [:show, :edit, :update, :destroy]
   before_action :authenticate_user!

def index
  @profiles = Profile.all
end

def show
  @profile = Profile.find(params[:id])
end

def new
  @profile = current_user.profile.build
end

def edit
end

def create
  @profile = Profile.new(profile_params)

  @profile.save
  redirect_to @profile
end

def update
  @profile = Profile.find(params[:id])
 if @profile.update(profile_params)
    redirect_to @profile
  else
    render 'edit'
  end 
end   

private

def find_profile
  @profile = Profile.find(params[:id])
end

def profile_params
  params.require(:profile).permit(:id, :name, :summary, :birthday, :user_id)
end
end

的routes.rb

Rails.application.routes.draw do
  devise_for :users
  resources :contacts, only: [:new, :create]
  resources :visitors, only: [:new, :create]
  root to: 'visitors#new'

  resources :posts
  resources :profiles


end

根据我的理解,当用户登录应用程序时,应用程序无法找到配置文件页面的ID。我猜这个ID需要在用户注册时同时创建。但是我不确定如何实现这种逻辑。

2 个答案:

答案 0 :(得分:0)

我也是rails的新手,但我的猜测是你的@ profile.save不成功且@profile没有id。如果无法将配置文件保存到数据库,则保存将返回false。所以,添加如下内容:

if @profile.save
  redirect_to @profile
else
  redirect_to 'new'
end

就像你做的更新一样。 您可能在生成配置文件模型后错过了运行db迁移吗?

答案 1 :(得分:0)

@profile作为user_signed_in?中的profile_path路由助手依赖于_navigation_links.html.erb时,您需要在每个页面请求上设置user_is_signed_in?

因此,如果ProfilesController#index,但是在执行@profile操作的profiles_page上,则会失败,因为您只为[:show, :edit, :update, :destroy]设置Task task = new Task<Void>() { @Override public Void call() { for(int i=0; i<filmInfoList.size(); i++){ updateProgress(i+1, filmInfoList.size()); if(filmInfoList.get(i).getImageURL() != null) { FilmSearchResult film = filmInfoList.get(i); Image searchItemImage = new Image(film.getImageURL()); ImageView searchItemImageView = new ImageView(searchItemImage); searchItemImageView.setPreserveRatio(true); searchItemImageView.setOnMouseClicked(e -> showDetails(film)); Platform.runLater(() -> { searchmoviesTilePane.getChildren().add(searchItemImageView); }); } } return null; } }; // .... private void showDetails(FilmSearchResult film) { // show details for film... }