1

Не знаете, как название мой вопрос ...Rails Пользователи, обновляющие информацию в пользовательских маршрутах?

Моя цель в том, что пользователи будут иметь список элементов (и только CURRENT_USER может редактировать этот список)

class Item < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :items 
end 

У меня есть контроллер Users (Примечание: Я также использую изобрести драгоценный камень, но создали отдельные пользователи контроллера)

class UsersController < ApplicationController 
    load_and_authorize_resource 
    def show 
    @user = User.find(params[:id]) 
    end 

    def list 
    @user.items.build 
    end 

    private 
    def set_user 
     @user = User.find(params[:id]) 
    end 

    def user_params 
     params.require(:user).permit(
     items_attributes: [:user_id, :item, :name, :_destroy]).merge(user_id: current_user.id) 
    end 
end 

Сейчас я настроил маршрутизацию

get 'users/:id/list', to: 'users#list', as: :list 

Который дает мне это: localhost:3000/users/1/list

Теоретически, это должно быть шоу вид ... где это будет заселить список элементов для идентификатора пользователя: 1.

Я хочу быть в состоянии сделать localhost:3000/list/edit Таким образом, пользователь может обновить этот список.

Моя форма в Просмотры/пользователи/list.html.erb (Я использую камень кокона для помощи в вложенных формах).

<%= simple_form_for @user do |f| %> 

    <%= f.simple_fields_for :items do |i| %> 
    <%= f.text_field :item %> 
    <%= f.text_field :name %> 
    <% end%> 

    <%= link_to_add_association 'add item', f, :items %> 
    <%= f.button :submit %> 

<% end %> 

Я знаю, что моя форма в моем list.html.erb, где он будет заполнять все пункты, но я просто делаю это для целей тестирования.

Как обновить форму для сохранения в базе данных объектов и ее связанных с текущим пользователем?

EDIT:

def update 
    @user = current_user.items.find_by_user_id(current_user.id) 

    respond_to do |format| 
    if @user.update(user_params) 


     format.html { redirect_to @user, notice: 'Congrats on your successful update!' } 
     format.json { render :show, status: :ok, location: @user } 
    else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

ответ

1

Там нет ничего плохого в том, форму в "шоу" вид. Если вы хотите только current_user, чтобы рассмотреть форму, а затем оберните форму в заявлении, если:

<% if @user == current_user %> 
    (form goes here...) 
<% end %> 

До тех пор, пока у вас есть update маршрут/действие для users, что форма должна представить (отказ от ответственности: Я никогда не использовали драгоценный камень cocoon).

Редактировать: Ваша форма должна быть в порядке, как есть. Добавьте этот маршрут к файлу routes.rb:

patch 'users/:id', to: 'users#update' 
+0

Ну, я «Я пытаюсь выяснить, что мое действие обновления и маршрут будут для формы, и когда (или если) его нужно отредактировать, какое это действие будет выглядеть. – hellomello

+0

Добавил маршрут к моему ответу –

+0

Теперь я получаю 'Действие 'update' не удалось найти для UserController'. Я просто копирую из другого действия по обновлению, которое я создал? – hellomello

0

Для текущей аутентификации пользователя, вы должны использовать cancan камень https://github.com/ryanb/cancan

Для вложенных полей, связанных с пользовательским nested_form жемчужиной является лучшим вариантом https://github.com/ryanb/nested_form

+0

Это не помогло мне. Ответ @ RyanK помог мне! – hellomello

+0

Несомненно. Я использовал эти два камня в своих проектах, и они просто сделали мою жизнь легкой. –

Смежные вопросы